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,但cookie大小應該遠離最大值,所以我認為這不是問題所在。
訪問主域 (
http://main.domain1.com
) 時會話工作正常,我在這裡缺少什麼?我覺得我缺乏關於 Nginx 或 Web 伺服器的一些理論知識,這使我無法做到這一點,但我已經為此苦苦掙扎了 3 天,嘗試了各種標頭和不同的組合,到目前為止我所有的研究無果。
終於解決了這個問題,問題是
main.domain1.com
使用SSL而其他域沒有,我嘗試在主域上禁用SSL並且它工作,其他域終於有了會話cookie,我必須看看它是否工作一次我將 SSL 添加到其他域並在主域上重新啟用它,但是一旦我到達那裡,我會越過那個橋。