需要帮助找到使用 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