我已经使用 nginx 缓存配置了 nginx|php-fpm。
我遇到的问题与 cookie 和缓存有关,我配置为绕过 cookie 名称和一些 request_uri,并且可以正常工作,在这里绕过它。
问题出现在几分钟后,如果是否注册,我是否会以不同的用户身份登录,以及当在不同页面中更改时,我是否会以不同的用户或相同的用户身份登录。
当我看到标题时,我看到完美的是,如果已登录,则通过 cookie 绕过,而当未登录时则说命中,我设置为绕过的页面说绕过,但作为用户登录(未登录)
不确定这里发生了什么,我尝试了一切但找不到这个问题的原因。
nginx.conf
fastcgi_cache_path /var/cache/nginx/dor levels=1:2 keys_zone=dor:10m inactive=60m max_size=1024m use_temp_path=off;
虚拟主机配置文件
set $skip_cache 0;
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
if ($request_uri ~* "confirm|feed|login|lost|logout|signup|admin|user|index.php|sitemap.php") {
set $skip_cache 1;
}
if ($http_cookie ~* "mainsite") {
set $skip_cache 1;
}
add_header Fastcgi-Cache $upstream_cache_status;
location ~ [^/]\.php(/|$) {
try_files $uri =404;
fastcgi_pass 127.0.0.1:9002;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 128k;
fastcgi_buffers 256 16k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_cache dor;
fastcgi_cache_valid 200 301 5m;
fastcgi_cache_min_uses 3;
fastcgi_cache_lock on;
fastcgi_cache_bypass $skip_cache;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout updating invalid_header http_403 http_500 http_503;
fastcgi_cache_revalidate on;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
fastcgi_no_cache $skip_cache;
include /etc/nginx/fastcgi_params;
}
答案1
下面的行为是相当危险的:
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
使用Set-Cookie
值中的 ,您实际上允许缓存某人的登录请求。您需要通过以下方式隐藏它fastcgi_hide_header
(如果操作不正确,这将破坏登录功能)或使用fastcgi_ignore_headers Cache-Control Expires;
(如果您的应用程序“不好”,这将完全破坏缓存,见下文)。
最好确定你的“登录位置”(例如POST /login
)并创建 2 个缓存配置:
登录位置。 和
fastcgi_ignore_headers
都不fastcgi_hide_header
是必需的。 请勿包含它们。其他页面位置。如果您的应用不必要地为任何页面启动会话(发送),则需要此设置
Set-Cookie
;很多应用都这样做。fastcgi_ignore_headers Cache-Control Expires Set-Cookie; fastcgi_hide_header Set-Cookie;
... 还有额外的好处。NGINX 很棒,但 Varnish 在操作客户端和上游标头方面非常灵活,例如:
sub vcl_recv {
if (req.http.cookie !~ "mainsite") {
unset req.http.cookie;
}
}
sub vcl_backend_response {
if (beresp.http.Set-Cookie && bereq.url != "/login") {
unset beresp.http.set-cookie;
}
}
答案2
您可以为登录用户添加一个 Cookie,然后将此 Cookie 值添加到缓存键中,如下所示
fastcgi_cache_key "$cookie_user_id$scheme$request_method$host$request_uri";
此外,你应该找到一个好的方法来加密和解密这个值以获得更高的安全性