由于某种原因:all
,对我来说,替换该域不起作用(第3.2.11条)。它花费了一部分自定义中间件来解决。该解决方案的摘要如下。
tl; dr:您需要编写自定义的机架中间件。您需要将其添加到您的中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:添加自定义中间件类
这是机架中间件出现的地方。一些相关的机架和导轨资源:
这是一个自定义类,您应该添加到其中。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技巧映射到本地主机。这很棒。有关更多信息,请参见此Railscast有关子域的信息和本说明。
希望那应该做。老实说,我不确定为什么会如此复杂,因为我觉得跨子域站点很常见。如果有人对这些步骤背后的原因有任何进一步的了解,请在评论中启发我们。