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

Проблема с файлами cookie кеша nginx

Я настроил nginx | ​​php-fpm с кешем nginx.

Проблема, с которой я столкнулся, связана с файлами cookie и кешем, я настраиваю обход имени файла cookie и некоторого request_uri и отлично работаю, обходя его здесь.

Проблема возникает, когда прошло несколько минут, если я зарегистрирован или нет, я вошел в систему с другим пользователем, и при изменении на разных страницах я вошел в систему с другим пользователем или тем же пользователем.

Когда я вижу заголовок, я вижу, что отлично, это обход файлов cookie, если он зарегистрирован, а когда не зарегистрирован, скажем, ударил, страницы, которые я настроил как обход, говорят об обходе, но зарегистрированы как пользователь (не зарегистрированы)

Не уверен, что здесь происходит, я пробую все и не могу найти причину этой проблемы.

nginx.conf

fastcgi_cache_path /var/cache/nginx/dor levels=1:2 keys_zone=dor:10m inactive=60m max_size=1024m use_temp_path=off;

vhost.conf

    set $skip_cache 0;
    if ($request_method = POST) {
        set $skip_cache 1;
    }

    if ($query_string != "") {
        set $skip_cache 1;
    }

    if ($request_uri ~* "confirm|feed|login|lost|logout|signup|admin|user|index.php|sitemap.php") {
        set $skip_cache 1;
    }

    if ($http_cookie ~* "mainsite") {
        set $skip_cache 1;
    }

    add_header Fastcgi-Cache $upstream_cache_status;

    location ~ [^/]\.php(/|$) {

        try_files $uri =404;

        fastcgi_pass                    127.0.0.1:9002;
        fastcgi_index                   index.php;
        fastcgi_split_path_info         ^(.+\.php)(/.+)$;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors        off;
        fastcgi_buffer_size             128k;
        fastcgi_buffers                 256 16k;
        fastcgi_busy_buffers_size       256k;
        fastcgi_temp_file_write_size    256k;
        fastcgi_cache                   dor;
        fastcgi_cache_valid             200 301 5m;
        fastcgi_cache_min_uses          3;
        fastcgi_cache_lock              on;
        fastcgi_cache_bypass            $skip_cache;
        fastcgi_cache_key               "$scheme$request_method$host$request_uri";
        fastcgi_cache_use_stale         error timeout updating invalid_header http_403 http_500 http_503;
        fastcgi_cache_revalidate        on;
        fastcgi_ignore_headers          Cache-Control Expires Set-Cookie;
        fastcgi_no_cache                $skip_cache;
        include                         /etc/nginx/fastcgi_params;
    }

Следующее довольно опасно:

fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

С Set-Cookie в значениях вы эффективно позволяете кэшировать чей-то запрос на вход. Вам нужно либо скрыть его от ответа через fastcgi_hide_header (что нарушит функцию входа в систему, если все будет сделано неправильно) или используйте fastcgi_ignore_headers Cache-Control Expires; (что полностью нарушит кеширование, если у вас «плохое» приложение, см. ниже).

Лучше всего указать ваше «местоположение для входа» (например, POST /login) и по сути создайте 2 конфигурации кеша:

  1. Место входа. Ни то, ни другое fastcgi_ignore_headers ни fastcgi_hide_header необходимы. Не включайте их.

  2. Расположение других страниц. Это необходимо, если ваше приложение запускает сеанс без необходимости (отправляет Set-Cookie) для любой страницы; довольно многие делают.

    fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
    fastcgi_hide_header Set-Cookie;
    

... и просто в качестве бонуса. NGINX хорош, но Varnish довольно гибок в управлении как наборами клиентских, так и исходных заголовков, например:

sub vcl_recv {
    if (req.http.cookie !~ "mainsite") {
        unset req.http.cookie;
    }
}
sub vcl_backend_response {
    if (beresp.http.Set-Cookie && bereq.url != "/login") {
        unset beresp.http.set-cookie;
    }
}