Nginx fastcgi_cache 从缓存提供服务时隐藏 Set-Cookie

Nginx fastcgi_cache 从缓存提供服务时隐藏 Set-Cookie

我正在尝试使用 nginx fastcgi_cache 来为我的网站提供一些页面,它运行正常,但我发现会话被复制到所有用户,因为 Set-Cookie 被缓存在响应中。

我尝试了几种解决方案,但我不想禁用这些页面中的 cookie,只想在从缓存提供服务时忽略它们。有什么办法吗?我考虑过改用 Varnish,但我在同一个服务器上有多个网站,我想避免这样做。

我也尝试过,但没有成功

fastcgi_cache_path /etc/nginx/cache/iteramos levels=1:2 keys_zone=ITERAMOS:120m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

set $supercache_uri $request_uri;
set $no_cache 1;

#set no cache to 0 (do cache) if we are in listing pages
if ($supercache_uri ~ ^/(preguntas|etiquetada|etiquetas)$) {
    set $no_cache 0;
    set $supercache_uri '';
}
if ($supercache_uri = /) {
    set $no_cache 0;
    set $supercache_uri '';
}

if ($supercache_uri ~ ^/?page= ) {
    set $no_cache 0;
    set $supercache_uri '';
}

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
    fastcgi_cache ITERAMOS;
    fastcgi_cache_valid 200 60m;
    #this header adds a hit / bypass / miss header
    fastcgi_cache_use_stale error timeout;
    add_header X-Cache $upstream_cache_status;
    fastcgi_cache_bypass $no_cache;
    fastcgi_no_cache $no_cache;
}

提前致谢

答案1

尝试使用fastcgi_hide_header

fastcgi_hide_header "Set-Cookie";

当请求命中缓存时,这将隐藏所有 cookie。 官方文档

答案2

以下解决方案在响应来自后端时发送所需的标头,然后如果响应来自缓存,则隐藏它。所示示例将隐藏来自缓存响应的所有 cookie。

您将需要 Lua 模块。我在 Debian 10 上安装了apt-get install libnginx-mod-http-lua

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

内部位置:

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

更多解释、没有 Lua 的其他选项以及我为什么需要 Lua(使用变量)的解释在这里:https://stackoverflow.com/a/59383747/4932239

相关内容