我将尝试配置Apache 2.4作为反向代理的mod_proxy,并遇到了一个问题:重定向无法从源服务器传递到客户端。
以下是虚拟主机配置中的具体内容:
在虚拟主机配置中使用注释掉的ProxyPass指令时,一切都运行良好,这意味着30x重定向来自原始服务器的请求被正确地重写并转发到客户端。
当在.htaccess中配置ProxyPass(我需要这样做,因为只有在某些情况下才需要),反向代理工作得很好,除了不处理任何重定向到客户端的请求。
我的.htaccess内容如下:
现在,每当原始服务器发送30x重定向时,客户端总是收到404-未找到错误。
在代理服务器日志中,我可以看到以下跟踪信息:
客户端获取以下标头信息:
我不明白为什么在.htaccess中配置Apache或mod_rewrite/mod_proxy时,不能正确地转发重定向。是否有解决方案?或者我做错了什么?谢谢。
以下是虚拟主机配置中的具体内容:
[...]
ProxyPreserveHost On
# ProxyPass "/" "http://old.domain.tld/"
ProxyPassReverse "/" "http://old.domain.tld/"
[...]
在虚拟主机配置中使用注释掉的ProxyPass指令时,一切都运行良好,这意味着30x重定向来自原始服务器的请求被正确地重写并转发到客户端。
当在.htaccess中配置ProxyPass(我需要这样做,因为只有在某些情况下才需要),反向代理工作得很好,除了不处理任何重定向到客户端的请求。
我的.htaccess内容如下:
RewriteEngine On
RewriteRule ^(.*)$ http://old.domain.tld/$1 [P]
现在,每当原始服务器发送30x重定向时,客户端总是收到404-未找到错误。
在代理服务器日志中,我可以看到以下跟踪信息:
[...] strip per-dir prefix: /[...]/domain.tld/htdocs/ ->
[...] applying pattern '^(.*)$' to uri ''
[...] rewrite '' -> 'http://old.domain.tld/'
[...] escaped URI in per-dir context for proxy, http://old.domain.tld/ -> http://old.domain.tld/
[...] forcing proxy-throughput with http://old.domain.tld/
[...] go-ahead with proxy request proxy:http://old.domain.tld/ [OK]
客户端获取以下标头信息:
HTTP/1.1 404 Not Found
Date: Fri, 25 Nov 2016 14:04:23 GMT
Server: Apache/2
Content-Length: 1060
Content-Type: text/html; charset=utf-8
Keep-Alive: timeout=5, max=100
Proxy-Connection: Keep-alive
我不明白为什么在.htaccess中配置Apache或mod_rewrite/mod_proxy时,不能正确地转发重定向。是否有解决方案?或者我做错了什么?谢谢。
ProxyPassReverse
已经设置,正如问题所述。但这并不能解释 OP 看到的 404 响应。如果ProxyPassReverse
没有设置,那么您可能会看到一个重定向回源服务器,从而“破坏”代理 - 但这不是这里正在发生的情况。 - MrWhite