めもめも のーと

ハマったこととか、覚えたこととか

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