Назад | Перейти на главную страницу

Nginx fastcgi_cache исключает cookie сеанса

Нужна помощь в поиске правильной настройки для использования 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