在Apache中寻找相当于ProxyPassReverseMatch来修复丢失的尾随正斜杠问题

我有两个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。 如果有人能够对这个问题有所了解,我们将会非常感激。 谢谢!

您可以忽略用户名和修正redirect时的任何内容:

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

由于这只是一个前缀replace。

我不认为你正确理解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和图像是在一个名为媒体文件夹不在我的前端机器,所以我只是添加了代理通行证并反转到我的/媒体目录。