Nginx
nginx proxy_pass 重寫響應頭位置
這個 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會載入頁面,但在出現與上述相同的問題之前沒有資產。
閱讀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/; }