コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

Railsのrequest.domainはデフォルトの場合、セカンドレベルドメイン相当まで

domainって書かれているのでサブドメインもまるっとひっくるめてもってくるのかと思いきやそうではなかったのでメモ

環境

rails (5.2.0)
  actionpack (= 5.2.0)

実装

request.domainを深掘りすると以下のコードに突き当たる

# /actionpack-5.2.0/lib/action_dispatch/http/url.rb
def extract_domain_from(host, tld_length)
  host.split(".").last(1 + tld_length).join(".")
end

ホスト名に対してトップレベルドメイン長さ(tld_length)分だけ取得して抽出する。

で引数に使われている数値は同ファイル内で定義されていて

#  /actionpack-5.2.0/lib/action_dispatch/http/url.rb
mattr_accessor :tld_length, default: 1

ってことなので基本はセカンドレベルドメイン相当しか取得ができない。

ちなみに host は以下の内容で抽出される

def raw_host_with_port
  if forwarded = x_forwarded_host.presence
    forwarded.split(/,\s?/).last
  else
    get_header("HTTP_HOST") || "#{server_name || server_addr}:#{get_header('SERVER_PORT')}"
  end
end

参考URL