Rails 3 session_store域是什么?真的吗?

更新的问题,使其更清楚

我知道你可以设置你的session_store域来共享这样的子域之间的会话: Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => "mydomain.com"

在Rails 3中,设置是什么:domain => :all可以吗? 它不能让你分享跨顶级域名的会话,cookies不能这样做。 该文件说,它假设一个顶级域名。 那么如果多个域访问您的应用程序会发生什么

在我的应用程序中,我的用户可以创build一个主域的个人子域,但也可以通过他们自己的自定义域访问该子域。

什么是正确的session_store域设置,以便我可以:a)跨主域的所有域共享会话,例如“mydomain.com”b)通过CNAME自定义访问其个人子域的用户,例如“user1.mydomain.com”像“some.otherdomain.com”url仍然可以创build单独的会话。

谢谢

好的,实现这一点的方法是dynamic地在会话cookie上设置域。 要做到这一点足够早,它应该作为机架中间件来完成:

 # 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名称,值,域和path。

:domain => :all告诉Rails在cookie域(这是浏览器浏览过的任何主机)前放一个点,这样cookie就适用于所有的子域。

下面是Rails 4.1的相关代码( actionpack/lib/action_dispatch/middleware/cookies.rb ):

  def handle_options(options) #:nodoc: options[:path] ||= "/" if options[:domain] == :all # if there is a provided tld length then we use it otherwise default domain regexp domain_regexp = options[:tld_length] ? /([^.]+\.?){#{options[:tld_length]}}$/ : DOMAIN_REGEXP # if host is not ip and matches domain regexp # (ip confirms to domain regexp so we explicitly check for ip) options[:domain] = if (@host !~ /^[\d.]+$/) && (@host =~ domain_regexp) ".#{$&}" end elsif options[:domain].is_a? Array # if host matches one of the supplied domains without a dot in front of it options[:domain] = options[:domain].find {|domain| @host.include? domain.sub(/^\./, '') } end end 

我看到你已经回答了关于允许子域名分开的问题的第二部分。

tl; dr:使用@Nader的代码。 但是我发现我需要将它添加到我的conifg/environments/[production|development].rb ,并将我的dot-prefixed-domain作为参数。 这是Rails 3.2.11

Cookie会话通常只存储在您的顶级域名中。

如果您查看Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}您可以看到sub1.yourdomain.comothersub.yourdomain.comyourdomain.com

挑战是在所有子域中使用相同的会话存储文件。

第1步:使用@Nader的CustomDomainCookie代码

这就是机架中间件的地方。一些更相关的机架和导轨资源:

  • 关于Rack的Railscasts
  • Railsguide机架
  • 为抽象的框架文档抽象地和cookie会话

基本上,它所做的就是将所有的Cookie会话数据映射回与根域相同的cookie文件。

第2步:添加到Railsconfiguration

现在你在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行。 还有其他人build议指定: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关于子域名和这个笔记的更多信息。

希望应该这样做。 我真的不完全确定为什么这个过程是这个错综复杂的,因为我觉得跨子网站是常见的。 如果有人对这些步骤背后的原因有进一步的了解,请在评论中给我们启发。

此选项用于确保应用程序能够跨子域共享会话。 The:all选项假定我们的应用程序的顶级域名大小为1.如果不是,那么我们可以指定一个域名,而这个域名将被用作会话的基本域。

嗯,

我部署了一个在www.xyz.com和xyz.com下托pipe的应用程序。

对于我来说,:domain =>:所有将session-cookie的域设置为xyz.com。 所以不是顶级域名,而是tld以上的1级。

Jan Willem