nginx proxy_pass重写响应头位置


11

此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主机,而是将浏览器重定向到 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 docs,它表明默认代理行为应该可以应对这种情况,尽管它似乎会失败。

日志似乎显示不多。

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

Answers:


3

proxy_pass目标添加斜杠。

更新: OP并没有确定虚拟主机是否接受https。由于该方案通过附加报头转发到后端服务器,因此会出现问题,因为在上游回复中重写标头而不是https 时,默认情况下proxy_redirect default;命令nginx期望使用http方案Location

因此,必须将其显式更改为更通用的形式(斜杠仍然是必需的):

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

Xavier,您好,感谢您的回复。那里没有运气。这是我尝试过的一件事(与proxy_pass文档匹配),但没有任何改变:(
Jake Edwards

我添加了有关另一个conf中的proxy_set_header的信息。删除主机行确实会改变事情-重定向到127.0.0.1:9000/users/sign_in
Jake Edwards

好的,所以问题是 行为期望为http 的scheme(https)proxy_redirect default。在注释掉Host标头并将proxy_redirect内容更改为之前,请按原样进行配置$scheme://$host:$server_port/ /gitlab/;。确保在测试时没有点击浏览器缓存的标题(使用cli工具或专用导航)。
哈维尔·卢卡斯

好的,很酷,所以现在它指向正确的URL(至少GitLab这样做,OpenWRT仍然转到/ cgi-bin / luci-一次一次)。但是没有任何资产/图像/等--:8080 / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js而不是:8080 / gitlab / assets / application-5ec1aeb4604cbfbeff836f956308b9563b0ed.js
Jake Edwards

1
@ShadowXVII资产链接是由您的应用程序生成的,您必须在此处进行更改。Nginx将仅重写由您的应用发布的重定向,而不是页面内容。
哈维尔·卢卡斯

0

@XavierLucas说的是正确的,支持者应该处理链接。gitlab文档在相对URL下的Install GitLab标题下有一个指南。我最近在安装安装了gitlab和nginx的Arch Linux服务器时遇到了这个问题,这通过重新编译所有资产以具有正确的相对路径来解决了我的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.