Evan..
19
出于某种原因,替换:all域名对我来说不起作用(rails 3.2.11).它花了一块自定义中间件来修复它.该解决方案的摘要如下.
tl; dr:你需要编写一个自定义的Rack Middleware.你需要将它添加到你的conifg/environments/[production|development].rb.这是在Rails 3.2.11上
Cookie会话通常仅存储在您的顶级域中.
如果你查看Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}你可以看到sub1.yourdomain.com和othersub.yourdomain.com和将有单独的条目yourdomain.com
挑战是在所有子域中使用相同的会话存储文件.
第1步:添加自定义中间件类
这就是Rack Middleware的用武之地.一些相关的机架和轨道资源:
这是一个你应该添加的自定义类.lib
这是由@Nader编写的,你们都应该感谢他
# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
def initialize(app, default_domain)
@app = app
@default_domain = default_domain
end
def call(env)
host = env["HTTP_HOST"].split(':').first
env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
@app.call(env)
end
def custom_domain?(host)
host !~ /#{@default_domain.sub(/^\./, '')}/i
end
end
基本上它的作用是将所有cookie会话数据映射回与您的根域相同的完全相同的cookie文件.
第2步:添加到Rails配置
既然您在lib中有自定义类,请确保自动加载它.如果这对您没有任何意义,请看这里:Rails 3自动加载
首先要确保您使用cookie商店在系统范围内.在config/application.rb我们告诉Rails使用cookie商店.
# We use a cookie_store for session data
config.session_store :cookie_store,
:key => '_yourappsession',
:domain => :all
这里提到的原因是因为这:domain => :all条线.还有其他人建议指定:domain => ".yourdomain.com"而不是:domain => :all.出于某种原因,这对我不起作用,我需要如上所述的自定义中间件类.
然后在你的config/environments/production.rb添加中:
config.middleware.use "CustomDomainCookie", ".yourdomain.com"
请注意,前面的点是必要的.有关原因,请参阅" 在父域请求中发送的子域cookie? ".
然后在你的config/environments/development.rb添加中:
config.middleware.use "CustomDomainCookie", ".lvh.me"
lvh.me技巧映射到localhost.这很棒.有关详细信息,请参阅此有关子域的Railscast和此注释.
希望应该这样做.老实说,我不完全确定为什么这个过程很复杂,因为我觉得跨域子站点很常见.如果有人对这些步骤背后的原因有任何进一步的见解,请在评论中启发我们.