我正在使用位于反向代理服务器(Nginx)后面的Rails应用程序,我需要将Rails应用程序的会话cookie标记为Secure
。但是,当我设置如下时,
Application.config.session_store :cookie_store, :key => '_app_session', :secure => true
Rails停止发送_app_session
cookie。
我知道Rails正在阻止它,因为我正在使用curl -v
直接攻击Rails,当我省略_app_session
时,我可以看到:secure => true
cookie。
如何强制Rails通过HTTP连接发送安全cookie?
注意:在这种特定情况下,通过HTTP发送安全cookie是可以的。这种流量发生在一个被认为是安全的区域,然后被包装在SSL中并发送到世界各地。此外,“terminating SSL upstream is quite common”,所以我不是第一个有这样设置的人。
以下是我已经尝试过的内容:
我在Lua中编写了一个脚本,将Secure
添加到cookie中。它起作用了,但是我的老板说我们不能在Nginx中拥有Lua。
我无法弄清楚如何在Nginx中使用以下指令来实现我想要的目标:
我尝试按照建议here添加set_proxy_header
和add_header
,但它不起作用,我怀疑我们的设置可能会造成一些特殊原因。
最后,假设我可以为Nginx编写一个C模块,但我不打算这样做。
答案 0 :(得分:5)
我将以下内容添加到我的Nginx配置文件中的相关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
。一旦我更好地理解了拓扑结构,我就可以在第一次代理传递之前执行{{1}}。这是正确的解决方案。
答案 1 :(得分:0)
你应该看看rack-ssl-enforcer gem。从rails中移除问题,并且它可根据您的需求进行高度配置。