2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ActionController::Redirecting::UnsafeRedirectErrorが出た時の対処法

Last updated at Posted at 2024-03-23

はじめに

自己紹介
未経験からWEB系エンジニアへの転職を目指している者です。現在はRuby on Railsを学習中です。

この記事を書いたきっかけ
現在、プログラミング学習コミュニティでモブプロの取り組みに参加しており、Railsを使って簡易的なURL短縮サービスを実装しています。
その中で、表題のエラーに遭遇したので備忘録として対処法をまとめました。

動作環境

  • ruby 3.2.2
  • rails 7.1.3

エラーの発生箇所

UrlsControllerの概要

  • params[:digest]で短縮urlで受け取る
  • Urlsテーブルを検索して短縮urlと紐づく、オリジナルurlを取得する
  • オリジナルurlにリダイレクトさせる

Urlsテーブル

  • オリジナルURLとそれに対応する短縮URLを管理し、作成日時と更新日時を追跡できる

コード

urls_controller
class UrlsController < ApplicationController
  def jump
    url = Url.find_by(digest: params[:digest])&.original
    if url.nil?
      render json: {}, status: 404
    else
      redirect_to url, status: 301
    end 
  end

エラー
image.png

redirect_to url, status: 301の行でエラーが発生しました。

エラーの調査

ActionController::Redirecting::UnsafeRedirectErrorについてRailsガイドで調べてみると以下のことがわかりました。
:page_facing_up:Railsガイド | config.action_controller

  • Action Controllerの構成を設定するための構成オプションにconfig.action_controllerがあり、その設定項目の一つとしてraise_on_open_redirectsがある
  • raise_on_open_redirectsのデフォルトの設定では、外部ホストを含むURLがredirect_toメソッドに渡されるとActionController::Redirecting::UnsafeRedirectErrorが発生する

今回の場合、短縮URLのリダイレクト先が外部ホストであるyahooのトップページとなっていたためエラーが発生したようです。

エラーの対処方法

Railsガイドによると、外部ホストを含むURLの呼び出しを許可する場合はredirect_toメソッドの呼び出しにallow_other_host: trueオプションを追加する必要があるとのことでした。
修正後のコード

urls_controller
class UrlsController < ApplicationController
  def jump
    url = Url.find_by(digest: params[:digest])&.original
    if url.nil?
      render json: {}, status: 404
    else
      # `allow_other_host: true`オプションを追加
      redirect_to url, allow_other_host: true, status: 301
    end 
  end
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?