我有两个Web服务器,www.example.com和www.userdir.com。 我试图使www.example.com作为前端代理服务器来处理http://www.example.com/~username格式的请求,例如
http://www.example.com/~john/
以便它发送一个内部请求
http://www.userdir.com/~john/
到www.userdir.com。 我可以在Apache中实现这一点
ProxyPass /〜john http://www.userdir.com/~john ProxyPassReverse /〜约翰http://www.userdir.com/~john
ProxyPassReverse是必要的,因为没有像http://www.example.com/~john这样的请求而没有尾随的正斜杠将被redirect为http://www.userdir.com/~john/ ,我希望我的用户留在example.com空间。
现在,我的问题是我有很多的用户,我不能在httpd.conf中列出所有这些用户名。 所以,我用
ProxyPassMatch ^(/〜。*)$ http://www.userdir.com$1
但在Apache中没有ProxyPassReverseMatch这样的事情。 没有它,每当url中的尾部正斜杠丢失,就会被引导到www.userdir.com,这不是我想要的。
我也尝试了以下内容来添加尾随的正斜杠
RewriteCond%{REQUEST_URI} ^ /〜[^。/] * $
RewriteRule ^ /(。*)$ http://www.userdir.com/$1/ [P]
但是它会渲染一个破碎的图像和CSS的页面,因为它们链接到http://www.example.com/images/image.gif而它应该是http://www.example.com/~john/images /image.gif 。
我一直在Google上search很长一段时间,但仍然找不到一个好的解决scheme。 如果有人能够对这个问题有所了解,我们将会非常感激。 谢谢!
我不认为你正确理解ProxyPassReverse指令的function。 这里是文档的一个exerpt:
http://httpd.apache.org/docs/2.2/mod/mod_proxy.html#proxypassreverse
这个指令让Apache调整HTTPredirect响应的Location,Content-Location和URI头中的URL。 当将Apache用作反向代理(或网关)时,这是非常重要的,以避免绕过反向代理,因为后端服务器上的HTTPredirect会停留在反向代理之后。
只有上面特别提到的HTTP响应头才会被重写。 Apache不会重写其他响应头, 也不会重写HTML页面内的URL引用。 这意味着如果代理内容包含绝对URL引用,他们将绕过代理。 Nick Kew的mod_proxy_html是第三方模块,它将查看HTML并重写URL引用。
此外,你不想自动添加一个尾随斜线到任何URL – 这可以打破很多链接。
现在,强制用户目录后面的斜线,我会去这样的事情:
RewriteRule ^/(~\w+)(/(.+)?)?$ http://www.userdir.com/$1/$3 [P]
一个非常有趣的文章,我后端服务器上的所有用户目录,并在前端服务器上进行代理,这对我工作..
ProxyPassMatch ^(/~.*)$ http://www.backend.com$1 ProxyPassReverse /~ http://www.backend.com/~
我在Chrome中使用隐身页面对此进行了testing,因为Firefox正在caching内容,所以我的testing页无法正常工作。 我认为要解决你的问题,在页面上,你可能不得不使用mod_proxy_html如上所示,我很幸运在后端所有的CSS和图像是在一个名为媒体文件夹不在我的前端机器,所以我只是添加了代理通行证并反转到我的/媒体目录。