Nginx fastcgi_cache 排除会话 cookie

Nginx fastcgi_cache 排除会话 cookie

需要帮助找到使用 Nginx fastcgi_cache 而不缓存 PHP 会话 cookie 的正确设置。下面是我目前所拥有的。但是,如果我转到已缓存的页面,在浏览器中删除我的 PHPSESSION cookie 并刷新,我会从缓存的 Nginx 文件之一中获得 PHPSESSION id。

if ($http_cookie = "PHPSESSION")
{
   set $fastcgi_skipcache 1;
}
location ~* \.php {
    include fastcgi_params;
    fastcgi_pass backend;
    fastcgi_index index.php;
    fastcgi_param SERVER_NAME $host;
    fastcgi_param SCRIPT_URL $fastcgi_script_name;
    fastcgi_param SCRIPT_URI $scheme://$http_host$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME "/index.php";
    fastcgi_param PHP_SELF $uri;
    fastcgi_param HTTPS $https if_not_empty;
    fastcgi_param HTTP_FRONT_END_HTTPS HTTPS;
    fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_param REQUEST_URI $uri?$args;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 90;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;

    #Caching
    fastcgi_cache ee;
    fastcgi_cache_key "$scheme$host$request_uri";
    fastcgi_cache_valid 200 302 168h;
    fastcgi_cache_valid 404 1m;
    fastcgi_cache_bypass $fastcgi_skipcache;
    fastcgi_no_cache $fastcgi_skipcache;

}

我们曾经在 Nginx 中使用 proxy_cache 进行如下工作,但是正在从 Nginx/Apache/Php 设置转移到 Nginx/PHP-FPM 设置。

    proxy_hide_header Set-Cookie;
    proxy_ignore_headers Expires Cache-Control Set-Cookie;
    proxy_set_header Cookie "";

    proxy_cache ee;
    proxy_cache_key         "$scheme$host$request_uri";
    proxy_cache_valid 200 302 60m;
    proxy_cache_valid 404 1m;

关联似乎在质疑同样的事情,但如果我使用 fastcgi_hide_header“Set-Cookie”;我们的购物车就会出现问题。我猜是因为它看不到会话。

如果需要更多详细信息,请告诉我。谢谢,

克里斯。

答案1

我觉得你把事情搞得太复杂了。试试这个:

fastcgi_no_cache $cookie_PHPSESSID;
fastcgi_cache_bypass $cookie_PHPSESSID;

顺便说一下,proxy_*指令是针对 nginx 充当代理人,例如在负载平衡方案中。我怀疑是否存在一种配置,当 nginx 既可以作为 fastcgi 后端,又可以作为某个位置的代理时。

答案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

相关内容