Нужна помощь в поиске правильной настройки для использования Nginx fastcgi_cache без кеширования файла cookie сеанса PHP. Вот то, что у меня сейчас есть ниже. Однако при тестировании, если я перехожу на страницу, которая была кэширована, удаляю свой файл cookie PHPSESSION в браузере и обновляюсь, я получаю идентификатор PHPSESSION из одного из кешированных файлов Nginx.
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"; у нас проблемы с корзиной. Я предполагаю, потому что он не видит сеанс.
Сообщите мне, если потребуется дополнительная информация. Спасибо,
Крис.
Я думаю, вы слишком усложняете. Попробуй это:
fastcgi_no_cache $cookie_PHPSESSID;
fastcgi_cache_bypass $cookie_PHPSESSID;
Кстати proxy_*
директивы предназначены для случая, когда nginx действует как доверенное лицо, например, в схеме балансировки нагрузки. Я сомневаюсь, что может быть конфигурация, когда nginx может быть как fastcgi-backend, так и прокси для одного места.
Я сделал решение, которое отправляет желаемый заголовок, когда ответ поступает из бэкэнда, а затем скрывает его, если ответ из кеша. Показанный пример скроет все файлы 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