由于某种原因:all
,用域替换对我来说不起作用(rails 3.2.11)。它需要一个自定义中间件来修复它。该解决方案的摘要如下。
tl;dr:您需要编写一个自定义机架中间件。您需要将其添加到您的conifg/environments/[production|development].rb
. 这是在 Rails 3.2.11 上
Cookie 会话通常只为您的顶级域存储。
如果您查看,您会看到and和 andChrome -> 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的用武之地。一些相关的 rack & rails 资源:
这是一个自定义类,您应该添加到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 autoload
第一件事是确保您在系统范围内使用 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 关于子域和此说明。
希望应该这样做。老实说,我不完全确定为什么这个过程如此复杂,因为我觉得跨子域站点很常见。如果有人对这些步骤背后的原因有任何进一步的见解,请在评论中启发我们。