我有两个 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
答案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 目录中即可。