nginx 缓存 cookies 问题

nginx 缓存 cookies 问题

我已经使用 nginx 缓存配置了 nginx|php-fpm。

我遇到的问题与 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;

虚拟主机配置文件

    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;
    }

答案1

下面的行为是相当危险的:

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;
    }
}

答案2

您可以为登录用户添加一个 Cookie,然后将此 Cookie 值添加到缓存键中,如下所示

fastcgi_cache_key  "$cookie_user_id$scheme$request_method$host$request_uri";

此外,你应该找到一个好的方法来加密和解密这个值以获得更高的安全性

相关内容