Nginx

Nginx 代理 cookie 未設置

  • January 18, 2021

這是我的情況,我有一個 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 添加到其他域並在主域上重新啟用它,但是一旦我到達那裡,我會越過那個橋。

引用自:https://serverfault.com/questions/938765