Я пытаюсь использовать nginx fastcgi_cache для обслуживания некоторых страниц моего сайта, он работал нормально, но я обнаружил, что сеансы дублируются для всех пользователей, потому что Set-Cookie был кэширован в ответе.
Я пробовал несколько решений, но я не хочу отключать файлы cookie на этих страницах, только чтобы игнорировать их при обслуживании из кеша. Есть какой-либо способ сделать это? Я подумывал о переходе на лак, но у меня есть несколько сайтов на одном сервере, и мне бы хотелось этого избежать.
Я также пробовал этот, но безуспешно
fastcgi_cache_path /etc/nginx/cache/iteramos levels=1:2 keys_zone=ITERAMOS:120m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
set $supercache_uri $request_uri;
set $no_cache 1;
#set no cache to 0 (do cache) if we are in listing pages
if ($supercache_uri ~ ^/(preguntas|etiquetada|etiquetas)$) {
set $no_cache 0;
set $supercache_uri '';
}
if ($supercache_uri = /) {
set $no_cache 0;
set $supercache_uri '';
}
if ($supercache_uri ~ ^/?page= ) {
set $no_cache 0;
set $supercache_uri '';
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
fastcgi_cache ITERAMOS;
fastcgi_cache_valid 200 60m;
#this header adds a hit / bypass / miss header
fastcgi_cache_use_stale error timeout;
add_header X-Cache $upstream_cache_status;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
}
заранее спасибо
Попробуй использовать fastcgi_hide_header
:
fastcgi_hide_header "Set-Cookie";
Это скроет все файлы cookie, когда запрос попадет в кеш. официальные документы
Следующее решение отправляет желаемый заголовок, когда ответ поступает от бэкэнда, а затем скрывает его, если ответ поступает из кеша. Показанный пример скроет все файлы 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