Как правильно кешировать запросы от анонимов?

Иван 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