我有一个 Apache Web 服务器,需要反向代理一个站点。因此,example.com/test/
或者example.com/test
从同一个其他 Web 服务器拉取。我为没有尾部斜杠的服务器设置了一个反向代理,如下所示:
ProxyPass /test http://othersite.com/test
ProxyPassReverse /test http://othersite.com/test
但它不适用于尾随斜杠。
有什么想法吗?我尝试过从 重定向/test/
到/test
,但没有成功。
谢谢。
答案1
您是否尝试过重写 URL?
RewriteEngine on
RewriteRule ^/test$ /test/ [R]
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /test/ http://othersite.com/test/
ProxyPassReverse /test/ http://othersite.com/test/
答案2
什么意思,它不能与尾部斜杠一起使用?它会重定向到错误的地方吗?它会给出 404 错误吗?这就是我用来设置反向代理并向世界其他地方隐藏来源的方法。
ProxyRequests off
<Location /guides>
ProxyPass http://blog.domain.com
ProxyPassReverse http://blog.domain.com
ProxyPassReverse /
ProxyHTMLEnable On
ProxyHTMLURLMap / /guides
ProxyHTMLURLMap http://blogs.domain.com /guides
RequestHeader unset Accept-Encoding
RequestHeader set MySpecialHeader secretkey
#LogLevel proxy:debug
</Location>
您可以使用它来测试您的代理:
$ curl -I http://localhost:81/guides/top5
HTTP/1.1 301 Moved Permanently
Location: http://localhost:81/guides/top5/
答案3
您必须在两个参数上都使用尾部斜杠,或者不使用。
文档说应该, 不是必须,但如果你这样做的话,我不会这么仁慈,因为效果不会很好。
如果第一个参数以尾随 / 结尾,则第二个参数也应以尾随 / 结尾,反之亦然。否则,对后端的最终请求可能会缺少一些所需的斜杠,并且无法提供预期的结果。
来自:http://httpd.apache.org/docs/current/mod/mod_proxy.html#ProxyPass
各种组合的结果如下:
ProxyPass "/aaa1/" "http://server2/mirror2/aaa2"
http://server1/aaa1 -> 错误页面(预期,没有文件 aaa1 并且没有代理)
http://server1/aaa1/ -> 错误(不是 server2):http://server1/mirror2/aaa2/
ProxyPass "/bbb1" "http://server2/mirror2/bbb2"
http://server1/bbb1 -> 错误(不是 server2):http://server1/mirror2/bbb2/
http://server1/bbb1/ -> 正确:地址显示 http://server1/bbb1/ 但内容来自 http://server2/mirror2/bbb2/
ProxyPass "/ccc1/" "http://server2/mirror2/ccc2/"
http://server1/ccc1 -> 错误页面(预期,如上所述)
http://server1/ccc1/ -> 正常:地址显示 http://server1/ccc1/ 但内容来自 http://server2/mirror2/ccc2/
ProxyPass "/ddd1" "http://server2/mirror2/ddd2/"
http://server1/ddd1 -> OK:地址显示 http://server1/ddd1/ 但内容来自 http://server2/mirror2/ddd2/
http://server1/ddd1/ -> OK:地址显示 http://server1/ddd1/ 但内容来自 http://server2/mirror2/ddd2/
结果:
如果要代理目录,请在两个参数中使用尾部斜杠。如果是文件,则不要使用。
ddd 很有趣,因为它似乎有效。它可能对 server2 进行了双重削减,这在文件系统上是可以的,但它似乎有问题。
我找不到对被评论为错误的行为的解释。路径来自 server2,由代理命令,但它在 server1 上打开。只是一个大胆的猜测,反向代理 (ProxyPass) 通常用作镜像/平衡器,也许这是一次恢复尝试?当文件在 server2 上未找到 mirror2/aaa2,尝试在 server1 上打开它?
@user59174 接受的答案是在两个参数上使用尾部斜杠,这就是它起作用的原因。
但推理完全错误,这进一步混淆了斜杠问题。
它之所以有效并不是因为重写。
实际上RewriteRule ^/test$ /test/ [R]
在大多数服务器上什么都不做,因为默认情况下由一个指令完成DirectorySlash On
,该指令默认为 ON。
因此,除非存在DirectorySlash Off
,否则所有不存在的文件都将作为目录(添加斜线)进行尝试
接下来,ProxyRequests Off
如果默认关闭,并且对反向代理没有影响。
ProxyPreserveHost On
是关于请求标头。