使用NGINX从缓存响应中删除标头

时间:2017-09-28 13:25:03

标签: python caching nginx cookies response-headers

我在几个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,将其从缓存的响应中删除,但也从该应用的响应中删除。所以没有人可以登录。哪个不好。

感觉应该有一个非常简单的解决方案,无论我多么努力,我都能找到它。

感谢任何帮助。

1 个答案:

答案 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强制使用变量,那我将不得不转向其他地方。