Я настроил nginx | php-fpm с кешем nginx.
Проблема, с которой я столкнулся, связана с файлами 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;
vhost.conf
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;
}
Следующее довольно опасно:
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;
}
}