Nginx

nginx proxy_pass 重寫響應頭位置

  • January 1, 2018

這個 nginx 實例的目的是讓 GitLab 和 OpenWRT Luci 通過反向代理重定向。它已經在其他幾個網站上工作,所有這些網站都有一個似乎可以解決這個問題的基本 url。

  • 本例中的 GitLab 位於本地伺服器的 9000 埠。
  • nginx 網站位於 8080 埠。
  • OpenWRT 有完全相同的問題,但是 /cgi-bin/luci/

範例位置的相關 nginx 配置是;

location /gitlab/ {
   proxy_pass http://127.0.0.1:9000/;
   proxy_redirect default;
}
  • 請注意,帶有和不帶有斜杠的結果是相同的。

有一些標頭代理配置選項應用於此位置。

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • 註釋掉 #proxy_set_header Host 會將瀏覽器重定向到https://127.0.0.1:9000/users/sign_in

當瀏覽到https://website.com:8080/gitlab/;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

響應錯誤地返回到/users/sign_in而不是/gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

手動瀏覽到https://website:8080/gitlab/users/sign_in會載入頁面,但在出現與上述相同的問題之前沒有資產。

GitLab 資產失敗

閱讀nginx 文件,它建議預設代理行為應該處理這種情況,儘管它似乎失敗了。

日誌似乎沒有顯示太多。

應該採取哪些額外步驟來幫助診斷為什麼會發生這種情況?

在目標後面添加一個斜杠proxy_pass

更新: OP 沒有準確說明虛擬主機正在接受https。由於該方案被轉發到帶有附加標頭的後端伺服器,因此會出現一個問題,因為proxy_redirect default;命令 nginx在重寫上游回復中的標頭時預設使用 http 方案,而不是 https。Location

因此,必須將其明確更改為更通用的形式(仍然需要尾部斜杠):

location /gitlab/ {
   proxy_pass http://127.0.0.1:9000/;
   proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

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