NGINX-将请求重定向到另一个IP,同时保留URL

NGINX-将请求重定向到另一个IP,同时保留URL

我已设置动态 DNS,并希望能够从家外访问不同的计算机。目前,我有一台在 192.168.1.2 上运行 nginx 的 Raspberry Pi,路由器的地址为 192.168.1.1。我还将路由器的 80 端口转发到 Raspberry Pi,因此只需点击动态 DNS URL 即可在我的 Raspberry Pi 登陆页面上显示 phpinfo() 页面。

接下来我希望能够mydns.com/device1保留该 URL,同时在后台重定向到其他设备。

换句话说,我将看到http://mydns.com/device1,但我将在http://192.168.1.3内部访问。此外,如果我输入 ,mydns.com/device1/login它将在内部重定向到http://192.168.1.3/login

sub_filter我尝试像这样使用:

sub_filter_once off;
sub_filter_types text/html;
sub_filter ""http://192.168.1.3" "http://192.168.1.2"
proxy_pass http://192.168.1.3/;
proxy_set_header Host $host;

这在某种程度上是有效的,但并非完全有效。路径没有重定向,例如子文件夹中的文件。例如:

我要这个: http://mydns.com/device1/style/basic.css

但请注意: http://mydns.com/style/basic.css

这会导致 404,如 Chrome 中的控制台视图所示。我收到此错误:

Failed to load resource: the server responded with a status of 404 (Not Found)

这是在路径上:http://mydns.com/style/basic.css但是我需要http://mydns.com/device1/style/basic.css

我可以在地址栏中输入http://mydns.com/device1/style/basic.css. 来访问 CSS 文件,所以我知道它是可访问的,我只是无法让 NGINX 转发/重写这些文件夹。

有人能帮忙吗?谢谢

答案1

可能有以下几个原因:

  • 或者在使用 proxy_pass 进入位置之前重写你的 URI;
  • 或者它在之前处理过的某些位置作为匹配的子 URI 提供;
  • 或者(在您的 nginx 版本中)proxy_pass 指令中 IP 后的斜杠/导致 nginx 将斜杠作为代理 URI 并在发送之前重写它。

如果不查看整个配置,就无法知道您这边到底发生了什么。或者您可以尝试启用调试日志(以查看导致此问题的原因)。

无论如何,与上述原因相关,您可以通过三种方法解决:

  • 要么避免重写,要么必须rewrite ... break在 proxy_pass 之前添加附加内容来扩展 URI;
  • 或者您可以尝试将其定义为proxy_pass http://192.168.1.3/device1/;或使用某些(映射)变量,例如proxy_pass http://192.168.1.3/$device/;或甚至使用完整的原始 URI proxy_pass http://192.168.1.3$request_uri;(请注意这里没有/)。
  • 或者您可以尝试删除尾随斜杠,因此proxy_pass http://192.168.1.3;(无斜杠)而不是proxy_pass http://192.168.1.3**/**;(有斜杠)
    在这种情况下“请求URI以与处理原始请求时客户端发送的相同形式传递给服务器”(如果没有发生重写),或“在处理更改的URI时传递完整的规范化请求URI”(如果发生了一些重写或者您有一些具有别名并try_files ... @proxy已传递的临时位置)。

看一眼代理密码有关 proxy_pass 使用的所有可能变体的文档。

相关内容