Yak shaving logs


My life is just yak shaving.

[Rails] friendly_idを利用している時にURLにIDが含まれている場合は404にする

2018/10/22 #rails #seo #friendly_id

By Yusuke Takita


こんにちは。Kajitz inc.の瀧田です。

friendly_idを利用してURLを id から code に変更していますが、
Model.friendly.find(params[:id]) をすると
id が来てもレコードが取得されます。

SEOの観点では同一のページを複数作成しているため無意識に放置していると良くなく、
(対応する場合はcanonicalをつけたりする必要があります)
悪意をもったユーザーを想定するとIDでおおよそのレコード数がばれてしまいます。

そのような背景からfriendly_idで設定した code 以外の id が来た場合には、
404にするように変更しました。

結論

結論から先に言うと以下の形で落ち着くことになりました。
共通的な404ページとは分ける必要があったので、 views/hoge_404 を新規作成しました。

    @hoge = Hoge.find_by(code: params[:id])
    return render template: 'errors/hoge_404', status: 404 unless @hoge

Hoge.find(params[:id]) でレコードがない場合は、 ActiveRecord::RecordNotFound がraiseされますが、
find_by だけ nil が変えてくるためガード文を入れる対応にしています。

実装オプション

その1. friendly_idの機能を利用する

いい感じのオプションがあるかなと思ったのですが、なかったためfriendly_idの機能を利用することはできませんでした。
history という機能を利用すれば、id できた場合には code にリダイレクトすることは可能なようでした。(ドキュメントなどを見ただけで未実装)

その2. 自前実装

friendly_idの機能が利用できないため、こちらを選択しました。

このエントリーをはてなブックマークに追加

categories


最新記事


tags