使用NGINX移除缓存响应中的头部信息

5
我有几个Flask应用程序在NGINX反向代理前运行。
我想为未登录的用户实现缓存。
即使对于匿名用户,Flask-login也会添加一个Set-Cookie标头,因为它包含带有CSRF令牌的会话cookie。这意味着我使用proxy_ignore_headers Set-Cookie;确保NGINX缓存实际上被缓存(它不会缓存并响应带有Set-Cookie标头的响应)。
我在应用程序中设置了一个单独的cookie来指示用户的登录/注销状态,并使用该cookie来确定是否使用缓存。这很好用。
问题是,已缓存的未登录用户响应包括设置会话cookie的Set-Cookie标头。该会话cookie提供给击中缓存的任何请求,最终导致不同的用户接收相同的CSRF令牌。
我想要防止Set-Cookie标头被存储在缓存中,或者在从缓存发送到客户端时删除/覆盖它。
我尝试了设置proxy_hide_headers Set-Cookie,它从缓存的响应中删除了它,但也从该应用程序的响应中删除了它。所以没有人可以登录。这很糟糕。
感觉应该有一种非常简单的解决方案,但无论我如何搜索都找不到。
感谢任何帮助。

我遇到了同样的问题,不是针对Flask,而是针对一个PHP网站。我感觉解决方案需要对nginx文件进行一些修改,或者在location{}内部添加一个复杂条件,比如如果缓存命中,则隐藏头部信息。 - Vixxs
1个回答

0

更新:经过尝试了无数事情,我有一个适用于多个 cookie 的解决方案,我想听听你们的意见。
在 Debian 10 上,我安装了apt-get install libnginx-mod-http-lua。我认为这不是完整的 OpenResty lua-nginx 模块,不是吗?

map $upstream_bytes_received $hide_cookie {
   default '';
   '' Set-Cookie;
}

内部位置:

header_filter_by_lua_block {
   ngx.header[ngx.var.hide_cookie] = nil;
}

它可以工作,我会进行更多的测试...


之前的回答,对于一个cookie,不使用Lua:

我一直在为此寻找解决方案,但目前仅适用于仅有一个 cookie。

首先,我遇到了以下问题:$proxy_hide_header 不接受变量,并且不能在 if() 中使用。
最终,我找到了一个包含可行解决方案的答案:使用标头过滤代理响应标头

所以,这是我的代码,我将进行更多测试,因为这是一个微妙的问题:

map $upstream_bytes_received $cookies {
default $upstream_http_set_cookie;
'' '';
}

然后在位置内:

    proxy_hide_header Set-Cookie;
    add_header Set-Cookie $cookies;

也许我会将默认设置为:不使用cookies,这样如果失败就会很明显,并且在隐私方面问题也较少。
但是我认为对于多个cookies,这种解决方案无法改进,我必须寻找其他方法,如果我能强制使用变量在$proxy_hide_header中,那么这将是最终的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接