![Nginx 代理 cookie 未设置](https://linux22.com/image/729342/Nginx%20%E4%BB%A3%E7%90%86%20cookie%20%E6%9C%AA%E8%AE%BE%E7%BD%AE.png)
这是我的情况,我有一个 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 添加到其他域并在主域上重新启用它后它是否有效,但一旦我到达那里,我就会解决这个问题。