看一下"What does Rails 3 session_store domain :all
really do?",但也看到Prathamesh Sonpatki(2020年3月)的"Building a Rails App With Multiple Subdomains",您确实应该使用中间件来根据传入的请求动态设置Cookie域.
# lib/middleware/dynamic_cookie_domain.rb
class DynamicCookieDomain
def initialize(app)
@app = app
end
def call(env)
host = env["HTTP_HOST"].split(':').first
Rails.application.config.session_store :cookie_store, key: "_myapp_session", domain: custom_domain(host), tld_length: 2
@app.call(env)
end
private
def custom_domain(host)
case host
when 'www.my-site.com', 'dashboard.my-site.com'
['dashboard.my-site.com', 'www.my-site.com']
else
host
end
end
end
如果请求来自这两个主机中的任何一个,则此中间件会将会话Cookie域设置为['dashboard.my-site.com', 'www.my-site.com']
.对于任何其他主机,它会将会话Cookie域设置为请求的主机.
您需要将此中间件添加到您的中间件堆栈中.您可以在应用程序配置中执行此操作:
# config/application.rb
require_relative '../lib/middleware/dynamic_cookie_domain'
module YourApp
class Application < Rails::Application
# ...
config.middleware.use DynamicCookieDomain
# ...
end
end
这将把DynamicCookieDomain
个中间件插入到您的中间件堆栈中,确保对每个请求都运行它.
这应该解决了www
和dashboard
子域与任何其他子域具有不同Cookie设置的要求.
中间件中的custom_domain
方法判断传入请求的主机.
如果主机是www.my-site.com
或dashboard.my-site.com
,它会将Cookie域设置为['dashboard.my-site.com', 'www.my-site.com']
.这意味着会话Cookie将在这两个子域之间共享.
对于任何其他主机(可以是任何其他子域或域),它将Cookie域设置为请求的主机.这意味着会话Cookie将特定于该子域或域,不会与www.my-site.com
或dashboard.my-site.com
共享.
这种基于传入请求的Cookie域的动态设置应该允许您对www
和dashboard
子域有一种设置,而对任何其他子域或域有不同的设置.
这与this answer略有不同,后者如果请求来自子域,则将Cookie域设置为第二级域(例如,my-site.com
),否则设置为:all
.这将在my-site.com
的所有子域之间共享Cookie.
相反,在这里,如果请求来自这两个主机中的任何一个,则Cookie域设置为['dashboard.my-site.com', 'www.my-site.com']
,否则将请求的主机设置为['dashboard.my-site.com', 'www.my-site.com']
.它共享dashboard.my-site.com
到www.my-site.com
之间的Cookie,但对所有其他子域使用单独的Cookie.