Apache RewriteRule代理不遵循重定向

时间:2016-11-25 14:33:54

标签: apache .htaccess redirect mod-rewrite mod-proxy

我正在尝试使用mod_proxy配置Apache 2.4作为反向代理,我遇到了从原始服务器传递到客户端的重定向问题。

我在虚拟主机配置中有以下配置:

[...]
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

我不明白为什么Apache或mod_rewrite / mod_proxy在.htaccess中配置时没有转发正确的重定向。

有没有解决方法呢?或者我做错了什么?

谢谢。

1 个答案:

答案 0 :(得分:0)

ProxyPassReverse可以处理重定向,因此原始服务器不会将客户端带到代理之外。

此指令可让Apache调整位置中的URL, HTTP重定向响应上的Content-Location和URI标头。这是 当Apache用作反向代理(或网关)时,必须避免 绕过反向代理,因为后端上的HTTP重定向 保留在反向代理后面的服务器。

仅上面特别提到的HTTP响应标头是 改写。 Apache不会重写其他响应头,也不会 重写HTML页面内的URL引用。这意味着,如果 代理内容包含绝对URL引用,它们将绕过 代理。第三方模块,将在HTML中查看并重写 URL引用是Nick Kew的mod_proxy_html。