在 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
# 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。