在 Apache 中寻找 ProxyPassReverseMatch 的等效项来修复缺少尾随正斜杠的问题

在 Apache 中寻找 ProxyPassReverseMatch 的等效项来修复缺少尾随正斜杠的问题

我有两个 Web 服务器,www.example.com 和 www.userdir.com。我尝试将 www.example.com 作为前端代理服务器,以处理类似以下格式的请求http://www.example.com/~用户名例如

http://www.example.com/~john/

这样它就会发送内部请求

http://www.userdir.com/~john/

到 www.userdir.com。我可以在 Apache 中使用以下方法实现此目的

ProxyPass /~john http://www.userdir.com/~john  
ProxyPassReverse /~john http://www.userdir.com/~john

反向代理密码是必要的,因为没有它,就像http://www.example.com/~john没有尾部斜杠将被重定向为http://www.userdir.com/~john/并且我希望我的用户留在example.com空间。

现在,我的问题是我有很多用户,我无法在 httpd.conf 中列出所有这些用户名。因此,我使用

ProxyPassMatch ^(/~.*)$ http://www.userdir.com$1

但不存在这样的事情代理密码反向匹配在 Apache 中。如果没有它,只要 URL 中缺少尾部正斜杠,就会直接转到 www.userdir.com,而这并不是我想要的。

我还尝试了以下方法来添加尾随的正斜杠

重写条件 %{REQUEST_URI} ^/~[^./]*$  
重写规则 ^/(.*)$ http://www.userdir.com/$1/ [P]

但随后它将呈现一个带有损坏图像和 CSS 的页面,因为它们链接到http://www.example.com/images/image.gif虽然应该http://www.example.com/~john/images/image.gif

我已经在 Google 上搜索了很长时间,但仍然找不到好的解决办法。如果有人能解释一下这个问题,我将不胜感激。谢谢!

答案1

修复重定向时,您可以忽略用户名及其后面的任何内容:

ProxyPassReverse /~ http://www.userdir.com/~

因为这只是一个前缀替换。

答案2

我认为您没有正确理解 ProxyPassReverse 指令的功能。以下是文档的摘录:

http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse

此指令允许 Apache 调整 HTTP 重定向响应中的 Location、Content-Location 和 URI 标头中的 URL。当 Apache 用作反向代理(或网关)时,这非常重要,以避免由于位于反向代理后面的后端服务器上的 HTTP 重定向而绕过反向代理。

只有上面特别提到的 HTTP 响应标头才会被重写。Apache 不会重写其他响应标头,也不会重写 HTML 页面内的 URL 引用。这意味着如果代理内容包含绝对 URL 引用,它们将绕过代理。第三方模块会查看 HTML 内部并重写 URL 引用,它是 Nick Kew 的 mod_proxy_html。

此外,您不想在任何 URL 上自动添加尾随斜杠 - 这可能会破坏很多链接。

现在,为了强制在用户目录后添加一个斜杠,我会选择如下方法:

RewriteRule ^/(~\w+)(/(.+)?)?$ http://www.userdir.com/$1/$3 [P]

答案3

这是一个非常有趣的帖子,我将所有用户目录放在后端服务器上,并在前端服务器上进行代理,这对我很有用。

ProxyPassMatch ^(/~.*)$ http://www.backend.com$1
ProxyPassReverse /~ http://www.backend.com/~

我使用 Chrome 中的隐身页面对此进行了测试,因为 Firefox 正在缓存内容,所以我的测试页面无法正常工作。我认为要解决页面中的问题,您可能必须使用上面建议的 mod_proxy_html,我很幸运,在后端,所有 css 和图像都在一个名为 media 的文件夹中,而这个文件夹不在我的前端机器上,所以我只需将代理传递和反向添加到我的 /media 目录中即可。

相关内容