工作上 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 在兩邊的實作與意義上不同,需要注意。