nginx proxy_pass 重写响应头位置

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://网站:8080/gitlab/users/sign_in加载页面,但没有资产,因为它们会掉落,直到出现与上述相同的问题。

GitLab 资产失败

阅读nginx 文档,它表明默认代理行为应该处理这种情况,尽管它似乎失败了。

日志似乎没有显示太多内容。

应采取哪些额外步骤来帮助诊断为什么会发生这种情况?

答案1

在您的目标后面添加一个斜杠proxy_pass

更新 :OP 没有明确说明 vhost 正在接受什么https。由于该方案通过附加标头转发到后端服务器,因此会出现问题,因为proxy_redirect default;nginx 需要等待默认的 http 方案在重写Location上游回复中的标头时,而不是 https。

因此,必须将其明确更改为更通用的形式(尾随斜杠仍然是必要的):

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

答案2

@XavierLucas 说的是正确的,后端应该处理链接。gitlab 文档在标题下有一个指南在相对 URL 下安装 GitLab。我最近在设置安装了 gitlab 和 nginx 的 arch linux 服务器时遇到了这个问题,通过重新编译所有资产以获得正确的相对路径解决了我的问题。

相关内容