如何使用Rails强制HTTP上的安全cookie

ein*_*ent 1 security cookies ssl ruby-on-rails nginx

我正在使用位于反向代理服务器(Nginx)后面的Rails应用程序,我需要标记Rails应用程序的会话cookie Secure.但是,当我设置如下,

Application.config.session_store :cookie_store, :key => '_app_session', :secure => true

Rails停止发送_app_sessioncookie.

我知道Rails正在阻止它,因为我正在直接使用Rails curl -v,_app_session当我省略时我可以看到cookie :secure => true.

如何强制Rails通过HTTP连接发送安全cookie?

注意:在这种特定情况下,通过HTTP发送安全cookie是可以的.这种流量发生在被认为是安全的区域,然后被包装在SSL中并发送到世界各地.此外," 在上游终止SSL很常见 ",所以我不是第一个有这样设置的人.

替代品(什么不起作用)

这是我已经尝试过的:

我在Lua中写了一个脚本,它添加Secure了cookie.它有效,但我的老板说我们不能在Nginx中拥有Lua.

我无法弄清楚如何在Nginx中使用以下指令来实现我想要的:

  • $ HTTP_HEADER
  • proxy_set_header
  • more_set_headers
  • $ cookie_COOKIE

我尝试添加set_proxy_headeradd_header按照此处的建议,但它不起作用,我怀疑我们的设置有一些特殊的东西可能导致这种情况.

最后,假设我可以为Nginx编写一个C模块,但我不打算这样做.

ein*_*ent 5

我将以下内容添加到location我的Nginx conf文件中的相关块中:

proxy_set_header X-Forwarded-Proto https;

它之前没有用X-Forwarded-Proto $scheme,因为我在我的问题中使用了链接的建议.我不知道为什么那不起作用,而是在做

$ curl -v -H "X-Forwarded-Proto: https" http://localhost:95/app-path

确实返回了预期的_app_sessioncookie,并Secure设置了标志,所以很明显RoR只需要知道安全cookie最终将通过https结束.

更新(2015年6月)

我遇到这个问题的原因是因为我们的服务器是代理传递http请求给自己https而不是X-Forwarded-Proto先设置.一旦我更好地理解了拓扑结构,我就可以X-Forwarded-Proto $scheme在第一次代理通过之前完成.这是正确的解决方案.