我在几个Flask应用程序面前运行NGINX作为反向代理。
我想为已注销的用户实施缓存。
Flask-login为每个响应添加Set-Cookie
标头,即使对于匿名用户也是如此,因为它包含带有CSRF令牌的会话cookie。这意味着我正在使用proxy_ignore_headers Set-Cookie;
来确保NGINX实际缓存这些内容(它不会缓存并使用Set-Cookie
标头进行响应)。
我在应用中设置了一个单独的cookie,以指示用户的登录/退出状态,并使用它来确定是否使用缓存。这很有效。
问题是已注销用户的缓存响应包括设置会话cookie的Set-Cookie
标头。此会话cookie将提供给任何访问缓存的请求,最终会导致不同的用户收到相同的CSRF令牌。
我想阻止Set-Cookie
标头存储在缓存中,或者当它从缓存中发送到客户端时删除/覆盖它。
我已尝试设置proxy_hide_headers Set-Cookie
,将其从缓存的响应中删除,但也从该应用的响应中删除。所以没有人可以登录。哪个不好。
感觉应该有一个非常简单的解决方案,无论我多么努力,我都能找到它。
感谢任何帮助。
答案 0 :(得分: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;
}
它有效,我将进行更多测试...
上一个答案,用于1个Cookie,不含Lua:
我一直在为此寻求解决方案,但目前它适用于仅一个 cookie。
首先,我遇到以下问题:$proxy_hide_header
不接受变量,并且不能在if()
内部使用。
我终于找到了一个包含可行解决方案的答案:Using a Header to Filter Proxied Response Headers。
这是我现在的代码,我将进行更多测试,因为这是一件很棘手的事情:
map $upstream_bytes_received $cookies {
default $upstream_http_set_cookie;
'' '';
}
然后在内部位置:
proxy_hide_header Set-Cookie;
add_header Set-Cookie $cookies;
也许我会默认:没有cookie,如果失败,这将是显而易见的,并且隐私方面的问题也较少。
但是我认为无法针对多个Cookie改进此解决方案,如果不得不在$proxy_hide_header
强制使用变量,那我将不得不转向其他地方。