Railsのrequestで取得できる情報の具体例をまとめた
Railsのリクエスト情報取得のメソッドがたくさんあってよく分からなかったのでまとめました。
例
request.path # /book/231/reg/top ----- request.fullpath # /book/231/reg/top?uid=d4f4efb0-a2dc&type=2 request.original_fullpath # /book/231/reg/top?uid=d4f4efb0-a2dc&type=2 ----- request.url # https://test.jp/book/231/reg/top?uid=d4f4efb0-a2dc&type=2 => protocolがhttpまたはhttpsの2択 request.original_url # https://test.jp/book/231/reg/top?uid=d4f4efb0-a2dc&type=2 => base_urlを使っており、その中でschemaメソッド内を使ってget_headerメソッドでプロトコルを取得しているので、http/https以外でもOK。
解説
fullpathとoriginal_fullpathの違い
original_fullpathは環境変数"ORIGINAL_FULLPATH"に値があれば優先して使用する。 なければfullpathを使うので、ほぼ同じ意味のようです。
def original_fullpath @original_fullpath ||= (env["ORIGINAL_FULLPATH"] || fullpath) end
urlとoriginal_urlの違い
urlの場合はプロトコルがhttpかhttpsの2択、original_urlはhttp(s)以外も扱える。
# actionpack/lib/action_dispatch/http/url.rb def url protocol + host_with_port + fullpath end def protocol @protocol ||= ssl? ? "https://" : "http://" end
# actionpack/lib/action_dispatch/http/request.rb def original_url base_url + original_fullpath end # lib/rack/request.rb def base_url url = "#{scheme}://#{host}" url = "#{url}:#{port}" if port != DEFAULT_PORTS[scheme] url end # lib/rack/request.rb def scheme if get_header(HTTPS) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SCHEME) get_header(HTTP_X_FORWARDED_SCHEME) elsif get_header(HTTP_X_FORWARDED_PROTO) get_header(HTTP_X_FORWARDED_PROTO).split(',')[0] else get_header(RACK_URL_SCHEME) end end
参考 https://easyramble.com/rails-request-url-original_url-differences.html