gpt4 book ai didi

nginx - nginx 反向代理背后的服务器忽略 URL 中的相对路径

转载 作者:行者123 更新时间:2023-12-04 04:38:24 26 4
gpt4 key购买 nike

我的标题不是最好的,我对 webstuff 的了解很基础,抱歉。

我想要达到的目标

我有一盒风扇盒在 Archlinux 上运行 nginx,我将其用作从互联网(即在我只能访问端口 80 和 443 的工作)通过反向代理工具使用我无法控制的更改域名的主要入口点,并且我们将调用 家网目前。

风扇盒将其端口 80 和 443 映射到 家网 ,那部分很容易。

我在防火墙后面有 2 个网络服务器, web1.lan , web2.lan , web2ilo.lan .这两者都有各种应用程序(在不同的机器上可能有相同的名称),可以通过标准 URL 在 LAN 上直接访问(名称仅作为示例给出,我无法控制内容):

http://web1.lan/phpAdmin/
http://web1.lan/gallery/
http://web2.lan/phpAdmin/
http://web2.lan/dlna/

...等等...

现在 web2ilo.lan 是一个特例。它是 HP 服务器的带外管理 Web 界面 web2.lan .该特定网络服务器仅提供 1 个应用程序,因此只能通过其根 URL 进行访问:
http://web2ilo/login.html 

我的目标是通过 的子路径访问这些家网像这样:
http://home.net/web1/phpAdmin/
http://home.net/web1/gallery/
http://home.net/web2/phpAdmin/
http://home.net/web2/dlna/
http://home.net/web2ilo/login.html

我的问题

这几乎有效,但 Web 应用程序倾向于重写 URL,以便在我登录后分别:
http://home.net/web1/phpAdmin/login.php
http://home.net/web2ilo/login.html

浏览器分别重定向到
http://home.net/phpAdmin/index.php
http://home.net/index.html

注意相对子路径 web1 web2ilo 已经走了,这在逻辑上给了我一个 404。

我的配置

到目前为止,我已经搜索了很多,我在 nginx 中尝试了很多选项,但并没有了解我在做什么。这是我的配置,它重现了这个问题。为清楚起见,我省略了 SSL。
   server {
listen 443 ssl;
server_name localhost;

# SSL stuff left out for clarity

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

location /web1/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web1.lan/;
}


location /web2/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web2.lan/;
}

location /web2ilo/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web2ilo.lan/;
}

}

第一次回答后

在前几个答案(谢谢!)之后,我意识到我的设置远非普通,我可能会独自一人遇到麻烦。

那么在不接触前端端口和域/主机名的情况下访问防火墙后面的网络服务器是一个更好的主意吗?

最佳答案

您不妨考虑使用设置proxy_redirect让 nginx 知道它应该将“后端”服务器响应 header (位置和刷新)修改为适当的前端 URL。您可以使用 default设置以允许 nginx 从您的 location 计算适当的值和 proxy_pass指令,或明确指定如下映射:

proxy_redirect http://web1.lan/ /web1/

见: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect

注意:这仅影响响应 header - 不影响 HTML 内容或任何 Javascript 中的任何链接。

如果您在内容或 Javascript 中遇到链接问题,您可以修改后端服务器上的内容(您已经指出这可能是不可能的),或者调整您的代理解决方案,使前端路径与后端相同那些(例如,您只有 http://frontend/web1/phpAdmin 而不是 http://frontend/phpAdmin )。这将需要添加 location每个应用程序的指令,例如,
location /phpAdmin/ {
proxy_set_header Host $host;
proxy_redirect off;
proxy_pass https://web1.lan/phpAdmin/;
}

关于nginx - nginx 反向代理背后的服务器忽略 URL 中的相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24634083/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com