在 Nginx 中,我们一直在尝试重定向 URL,如下所示:
http://example.com/some/path -> http://192.168.1.24
用户仍然可以在浏览器中看到原始 URL。一旦用户被重定向,假设他们点击链接到/section/index.html
,我们希望它发出一个导致重定向的请求
http://example.com/some/path/section/index.html -> http://192.168.1.24/section/index.html
并再次保留原始 URL。
我们的尝试涉及使用代理和重写规则的各种解决方案,下面显示了使我们最接近解决方案的配置(请注意,这是 Web 服务器的 Web 服务器配置example.com
)。但是,这样做仍然存在两个问题:
- 它无法正确执行重写,因为 Web 服务器接收到的请求 URL
http://192.168.1.24
包含/some/path
并因此无法提供所需的页面。 提供页面后,当您将鼠标悬停在链接上时,
/some/path
URL 中缺少server { listen 80; server_name www.example.com; location /some/path/ { proxy_pass http://192.168.1.24; proxy_redirect http://www.example.com/some/path http://192.168.1.24; proxy_set_header Host $host; } location / { index index.html; root /var/www/example.com/htdocs; } }
我们正在寻找一种仅涉及更改example.com
. 我们可以更改192.168.1.24
(也包括 Nginx)上的配置,但是我们想尝试避免这种情况,因为我们需要为数百个通过代理访问的不同服务器重复此设置example.com
。
proxy_pass
您应该在指令中使用 URI 部分。此外,您混淆了proxy_redirect
指令的顺序参数,可能根本不需要它。Nginx 对该指令有合理的默认值。在这种情况下,您的
location
块可能非常简单:首先,您不应该
root
在 location 块中使用指令,这是一种不好的做法。在这种情况下,这并不重要。尝试添加第二个位置块:
这会将 /some/path/ 之后和 index.html 之前的部分捕获到 $section 变量,然后用于设置 proxy_pass 目标。如果需要,您可以使正则表达式更具体。
/some/path/
您可以使用以下配置在前端和后端之间进行 100% 无缝映射/
。请注意,这是迄今为止唯一可以无缝处理生成
404 Not Found
错误的绝对路径的答案,前提Referer
是浏览器发送了正确的 HTTP 标头,因此,所有这些 gif 应该继续加载,而无需修改底层 HTML (这不仅昂贵,而且如果没有默认未编译的附加模块也不支持)。您可以在https://github.com/cnst/StackOverflow.cnst.nginx.conf存储库中找到完整的概念验证和最小可行产品。
这是一个测试运行,以确认所有边缘情况似乎都有效:
PS 如果您有很多不同的映射路径,那么您可能希望使用基于全局的指令,而不是对
$http_referer
within 进行if
正则表达式比较。location @404
map
另请注意,根据相关答案
proxy_pass
, 以及location
它所包含的尾部斜杠都非常重要。参考:
当该斜杠添加到 nginx 代理 jenkins 时,您会看到“您的反向代理设置似乎已损坏”错误。
它应该读