Nginx 代理 cookie 未设置

Nginx 代理 cookie 未设置

这是我的情况,我有一个 Rails 4 应用程序,可以被多个域访问,根据域的不同,内容也会发生变化。

假设主域是 ,domain1而所有其他域仅使用 Nginxproxy_pass将请求转发到domain1,除了未设置会话或其他 cookie 之外,一切都运行正常domain2

在我的 Rails 应用程序中,我创建了一个中间件,它domain根据使用CUSTOMHEADER标头内容访问应用程序的域动态设置会话,并且我可以在 Set-Cookie 标头中看到 cookie 域是正确的,所以我认为我的问题出在我的 Nginx 配置中,但遗憾的是我对 Nginx 的了解非常有限。

Nginx 配置

以下是示例主机文件domain2(未设置 cookie 的示例域之一):

server {
  listen   80;

  server_name domain2.com;
  rewrite ^(.*) http://www.domain2.com$1 permanent;
}

server {
  listen   80;
  server_name www.domain2.com;

  location /assets/ {
    proxy_pass                      https://main.domain1.com/assets/;
    proxy_set_header                X-Real-IP       $remote_addr;
    proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header                Cookie $http_cookie;
    proxy_set_header                CUSTOMHEADER www.domain2.com;
    proxy_pass_request_headers      on;
  }

  location /some_path/ {
    proxy_pass                      https://main.domain1.com/some_path/;
    proxy_set_header                X-Real-IP       $remote_addr;
    proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header                Cookie $http_cookie;
    proxy_set_header                CUSTOMHEADER www.domain2.com;
    proxy_pass_request_headers      on;
  }

  location / {
    proxy_pass                      https://main.domain1.com;
    proxy_set_header                X-Real-IP       $remote_addr;
    proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header                Cookie $http_cookie;
    proxy_set_header                CUSTOMHEADER www.domain2.com;
    proxy_pass_request_headers      on;
    rewrite ^/(.*)$ /sites/some-id/$1 break;
  }
}

当我在浏览器中打开一个页面并检查标题时,我得到以下内容(在 Chrome 中):

响应标头

HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Mon, 05 Nov 2018 22:21:45 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Vary: Accept-Encoding
Status: 200 OK
Cache-Control: max-age=0, private, must-revalidate
Strict-Transport-Security: max-age=31536000
X-XSS-Protection: 1; mode=block
X-Request-Id: 33d26df0-f44c-4ff5-9513-62aaade8c581
ETag: W/"3dd8553b2a02cfc9f85a609c5f90bafb"
X-Frame-Options: SAMEORIGIN
X-Runtime: 0.025616
X-Content-Type-Options: nosniff
Set-Cookie: _myapp_session=dmNFR2...3ae445b; domain=www.domain2.com; path=/; secure; HttpOnly
X-Powered-By: Phusion Passenger 5.1.2
Content-Encoding: gzip

请求标头

GET /login HTTP/1.1
Host: www.domain2.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: http://www.domain2.com/bla
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,pt;q=0.8,fr;q=0.7
If-None-Match: W/"09c9ac3842dd3942a006b9000bd7a29d"

如您所见,响应包含Set-Cookie标头,并且 cookie 具有正确的域,但浏览器从未设置过 cookie,并且您还会注意到请求没有标头Cookie,尽管这可能只是因为没有要发送的 cookie。

注 1:我也尝试过在来自 Rails 应用程序的响应中设置以下标头,但这没有帮助:

  • Access-Control-Allow-Origin: *
  • Access-Control-Allow-Credentials: true

笔记2:我知道如果 cookie 过大,浏览器将不会创建它,但是 cookie 大小应该远离最大值,所以我不认为这是这里的问题。

访问主域 ( http://main.domain1.com) 时会话工作正常,我这里缺少什么?我觉得我缺乏一些关于 Nginx 或一般 Web 服务器的理论知识,这阻碍了我做到这一点,但我已经为此奋斗了 3 天,尝试了各种标头和不同的组合,到目前为止,我所有的研究都无果而终。

答案1

终于解决了这个问题,问题是main.domain1.com使用 SSL 而其他域没有,我尝试在主域上禁用 SSL 并且成功了,其他域最终有了会话 cookie,我必须看看一旦我将 SSL 添加到其他域并在主域上重新启用它后它是否有效,但一旦我到达那里,我就会解决这个问题。

相关内容