Nginx proxy_cookie_header 不工作(域 <-> 子域)

Nginx proxy_cookie_header not working (domain<-> sub domain)

我对这个问题感到筋疲力尽.. 2 天...我相信有人可以抓住这个错误..
现在我正在做一个网站。在本地系统中完全没问题。但是这个错误发生了。当由 nginx 反向代理发布时。

[环境]
前端 - Next.js (owl-dev.me)
后端 - .Net Core (backend.owl.dev.me)
Nginx - 1.18.0

[问题]
登录后,我从后端收到了一个 Cookie。 但 cookie 的域不是 owl-dev.me,而是 backend.owl.dev.me。所以无法在 ssr 中保存和获取 cookie(* 如果我在浏览器中手动更改域名,它工作正常) enter image description here

[我试过的]
我发现 nginx 可以通过 nginx 更改 cookie 域。 proxy_cookie_domain 但它没有用。
一些文章说可以通过正则表达式工作但没有工作。
我该如何解决这个问题?怎么了??!!?

[Nginx 设置]

server {
    # SSL configuration
    #
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    client_max_body_size 10M;

    ssl_certificate "/etc/letsencrypt/live/www.owl-dev.me/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/www.owl-dev.me/privkey.pem";
    ssl_dhparam "/etc/nginx/ssl/dhparams.pem";

    add_header Strict-Transport-Security "max-age=31536000";

    # Add index.php to the list if you are using PHP

    server_name owl.dev.me  www.owl-dev.me;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://localhost:3000;
    }   
}

server {
    # SSL configuration
    #
    listen 443 ssl http2;
    listen [::]:443 ssl http2 ;
    client_max_body_size 10M;

    ssl_certificate "/etc/letsencrypt/live/backend.owl-dev.me/fullchain.pem";
    ssl_certificate_key "/etc/letsencrypt/live/backend.owl-dev.me/privkey.pem";
    ssl_dhparam "/etc/nginx/ssl/dhparams.pem";

    server_name backend.owl-dev.me;

    location / {
        proxy_cookie_domain ~^(.*)$ "; Domain=backend.owl-dev.me";
        proxy_set_header Host www.owl-dev.me;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass https://localhost:5001;
    }
}

首先也是最重要的是 proxy_cookie_domain 指令仅用于更改来自上游的 cookie 的 domain 属性。也就是说,如果这样的 cookie 不包含 domain 属性,proxy_cookie_domain 指令将完全无用,并且这样的 cookie 将绑定到它来自的域。

第二,看起来我对这个主题的了解不知何故已经过时,而且规格在过去几年中发生了变化。前导点字符已过时,并且设置为某个域的 cookie 无论如何都可用于其所有子域。这是 RFC 6265 says 截至目前的内容:

The Domain attribute specifies those hosts to which the cookie will be sent. For example, if the value of the Domain attribute is "example.com", the user agent will include the cookie in the Cookie header when making HTTP requests to example.com, www.example.com, and www.corp.example.com. (Note that a leading %x2E ("."), if present, is ignored even though that character is not permitted, but a trailing %x2E ("."), if present, will cause the user agent to ignore the attribute.) If the server omits the Domain attribute, the user agent will return the cookie only to the origin server.

The user agent will reject cookies unless the Domain attribute specifies a scope for the cookie that would include the origin server. For example, the user agent will accept a cookie with a Domain attribute of "example.com" or of "foo.example.com" from foo.example.com, but the user agent will not accept a cookie with a Domain attribute of "bar.example.com" or of "baz.foo.example.com".

对我来说,如果这样的 cookie 来自 backend.owl-dev.me 域,听起来您不能将 cookie domain 属性设置为 www.owl-dev.me,但是设置 domain 属性到 owl-dev.me(这将使 cookie 可用于 owl-dev.me 域和 any 它的子域)应该没问题。

综上所述,要将 domain 属性更改为 owl-dev.me,无论它在上游响应中设置的值是什么,都可以使用以下指令:

proxy_cookie_redirect ~^ owl-dev.me;

(其中 ~^ 是匹配任何字符串的正则表达式模式)。但是,如果来自上游的 cookie 根本没有 domain 属性,则该指令将无效。