子站间 携带cookie_在Rails中的子域之间共享会话(cookie)?

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和此注释.

希望应该这样做.老实说,我不完全确定为什么这个过程很复杂,因为我觉得跨域子站点很常见.如果有人对这些步骤背后的原因有任何进一步的见解,请在评论中启发我们.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值