我已设置动态 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/;
或甚至使用完整的原始 URIproxy_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 使用的所有可能变体的文档。