Nic Lin's Blog

喜歡在地上打滾的 Rails Developer

[Rails] 何為 tld_lebgth?

在 Rails 專案中想設定跨域 domain,像是部落格 CMS 系統,能給每個用戶 subdomain 當作專屬網址。

這樣在設定 session 時,就需要注意能夠讓所有子網域都共用,否則會造成在 “dd3.today” 登入後,卻發現在 “anyteam.dd3.today” 失效,出現了需要重新登入的情況。

所以我們要在 session 設定共用,如下

  MyApp::Application.config.session_store(
    :cookie_store,
    {
      :key => '_myapp_session',
      :domain => :all, # :all defaults to da tld length of 1, '.web' has length of 1
      :tld_length => 2 # Top Level Domain (tld) length -> '*.myapp.web' has a length of 2
    }
  )

起初其實不太能明白 tld_length 意思為何?

但去看了 source code 之後發現其實不難懂

這裡用舊的 rails code 下去看,因為新版的 rails 都被拆出去獨立的 class 還要追 XD

domain(tld_length = 1)

# File actionpack/lib/action_dispatch/http/url.rb, line 78
      def domain(tld_length = 1)
        return nil unless named_host?(host)

        host.split('.').last(1 + tld_length).join('.')
      end

所以稍微試玩了一下

tld_length = 2
host = "1.2.3.4.5.dd3.today"
host.split('.').last(1 + tld_length).join('.')

# "5.dd3.today"

其實更快一點的理解,你就直接把 tld_length 當作你的 session 共用設定最多支援有幾個 dot 的 domain。

參考資源

comments powered by Disqus