tld_length 在 Rails session_store 與 HTTP URL 的設定
工作上 rails 在每個 stage 的 domain 長度都不太一樣
例如 production 是 example.com
,staging 是 kerkerj.staging.example.com
MyApp::Application.config.session_store :redis_session_store, {
key: 'example_session_token',
domain: :all,
tld_length: 4,
serializer: :hybrid,
redis: {
host: "....",
key_prefix: "...",
expire_after: 7.day,
}
}
相關原始碼: action_dispatch/middleware/cookies.rb
在這裡的 tld_length
就是看你 domain 的 tld 想設定到哪就寫多少
以 kerkerj.staging.example.com
為例,想要 example.com
就是 2,想要 kerkerj.staging.example.com
就是 4
而在 Rails App 裡,在 config.action_dispatch.tld_length
(或 ActionDispatch::Http::URL.tld_length
) 設定的 tld_length
在 rails api document 的 #domain
有用法
原始碼則解釋得更清楚 actionpack/lib/action_dispatch/http/url.rb
> ActionDispatch::Http::URL.extract_domain("kerkerj.staging.example.com", 1)
=> "example.com"
> ActionDispatch::Http::URL.extract_domain("kerkerj.staging.example.com", 2)
=> "staging.example.com"
> ActionDispatch::Http::URL.extract_domain("kerkerj.staging.example.com", 3)
=> "kerkerj.staging.example.com"
> ActionDispatch::Http::URL.extract_domain("example.com", 1)
=> "example.com"
> ActionDispatch::Http::URL.extract_domain("example.com", 3)
=> "example.com"
tld_length
在兩邊的實作與意義上不同,需要注意。