[英]How to force a secure cookie over HTTP with Rails
我正在使用位于反向代理服务器(Nginx)后的Rails应用程序,并且需要将Rails应用程序的会话cookie标记为Secure
。 但是,当我将其设置如下
Application.config.session_store :cookie_store, :key => '_app_session', :secure => true
Rails停止发送_app_session
cookie。
我知道Rails会阻止它,因为我直接用curl -v
击中了Rails,并且当我忽略:secure => true
时,我可以看到_app_session
cookie。
如何强制Rails通过HTTP连接发送安全cookie?
注意:在这种特定情况下,可以通过HTTP发送安全cookie。 在被封装为SSL并发送到世界之前,这种流量发生在一个被认为安全的区域。 此外,“ 在上游终止SSL相当普遍 ”,因此我不是第一个拥有这种设置的人。
这是我已经尝试过的方法:
我在Lua中编写了一个脚本,将Secure
添加到cookie。 它奏效了,但是我的老板说我们不能在Nginx中使用Lua。
我不知道如何在Nginx中使用以下指令来实现所需的功能:
我尝试按照此处的建议添加set_proxy_header
和add_header
,但是它没有用,并且我怀疑我们的设置可能会导致某些add_header
。
最后,假设我可以为Nginx编写一个C模块,但是我不会这样做。
我在Nginx conf文件的相关location
块中添加了以下内容:
proxy_set_header X-Forwarded-Proto https;
以前没有用,因为我在问题链接的建议中使用了X-Forwarded-Proto $scheme
。 我不知道为什么那没用,但是
$ curl -v -H "X-Forwarded-Proto: https" http://localhost:95/app-path
确实会返回预期的_app_session
cookie,并设置了Secure
标志,因此显然RoR只需要知道安全cookie最终将通过https发出。
更新(2015年6月)
之所以遇到这个问题,是因为我们的服务器代理将http
请求传递给自己以获取https
而不是先设置X-Forwarded-Proto
。 一旦更好地了解了我们的拓扑,就可以在第一次通过代理之前执行X-Forwarded-Proto $scheme
。 那是正确的解决方案。
您应该看一下rack-ssl-enforcer gem。 从导轨上消除了问题,并且可以根据您的需求进行高度配置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.