Как правильно кешировать запросы от анонимов?
Иван
nginx на kinetiksoft.com
Чт Апр 20 17:30:40 UTC 2017
Здравствуйте!
Достаточно популярная, как мне кажется, проблема. Хочу кешировать запросы к
какому-то локейшену, например, к / , но только от анонимных пользователей. То
есть тех, у которых еще нет для нас никаких кук.
Как это правильно сделать в условиях бэкэнда, который, как, например, извините
за выражение, битрикс, ставит куку типа PHP_SESSID при любом запросе?
То есть по факту мой вопрос сводится к тому, как выполнять
fastcgi_ignore_headers Set-Cookie;
или не выполнять в зависимости от каких-то условий, например, от наличия уже
поставленных пользователю кук.
Пока я создал вот такого монстра (он работает, но мне не нравится):
map $http_cookie $main_cache {
default 0;
"" 1;
}
location = / {
if ($main_cache) {
rewrite ^ /_main_cache/ last;
}
fastcgi_pass unix:/run/php-fpm.socket;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param HTTP_GEOCOUNTRY $geoip_country_code;
}
location = /_main_cache/ {
internal;
#Это чтоб в бэкэнд везде приходил правильный адрес, никто не должен знать про
_main_cache
rewrite ^ / break;
fastcgi_cache main;
fastcgi_hide_header "Set-Cookie";
fastcgi_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
fastcgi_cache_valid 200 10s;
fastcgi_cache_key "/";
fastcgi_cache_use_stale updating;
fastcgi_cache_lock on;
#Аноним после первого посещения не аноним, а так как мы игнорируем Set-Cookie
ставим средствами nginx.
add_header "Set-Cookie" "visited=1; path=/";
fastcgi_pass unix:/run/php-fpm.socket;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_param HTTP_GEOCOUNTRY $geoip_country_code;
}
Можно как-то изящнее и феншуйнее? Пожалуйста, не предлагайте переделывать
бэкэнд. Это нереально.
С уважением, Иван.
Подробная информация о списке рассылки nginx-ru