我正在尝试配置一个具有两个代理的环境。想法是第一个代理重定向到第二个代理,第二个代理重定向到最终网站。
该配置适用于正常请求。但我遇到了 HTML 重定向问题。
环境如下:
M1 (with apache) M2 (with apache) M3 (e.g. Jetty)
host: h1 host: h2 host: h3
port:9001 port: 9002 port: 9003
proxy policies: proxy policies: webs:
/a/b/ *2:9002/ / *3:9003/ c
d
正常请求是http://h1:9001/a/b/d
。url 翻译如下:
(m1) http://h1:9001/a/b/d -> (m2) http://h2:9002/d -> (m3) http://h3:9003/d
我的配置适合这个请求。
问题是当我尝试从 Web c 到 Web d 进行 HTML 重定向时。(通常是 302)。重定向 URL 必须返回到浏览器。URL 转换应如下所示:
(m1) http://h1:9001/a/b/c -> (m2) http://h2:9002/c -> (m3) http://h3:9003/c
---(redirection to http://h3:9003/d)---
(m3) http://h3:9003/d -> (m2) http://h2:9002/d -> (m1) http://h1:9001/a/b/d
---(making redirection)---
(m1) http://h1:9001/a/b/d -> (m2) http://h2:9002/d -> (m3) http://h3:9003/d
问题是返回到浏览器的 url 是http://h1:9001/d
而不是http://h1:9001/a/b/d
如果第二个代理(m2)不存在,则不存在此问题,返回给浏览器的地址是http://h1:a/b/d
哪一个可能是问题?
提前致谢。
配置文件:
m1 中 httpd.conf 的摘录:
<VirtualHost *:9001>
ProxyRequests On
ProxyPreserveHost On
ProxyPass /a/b/ http://h2:9002/
ProxyPassReverse /a/b/ http://h2:9002/
</VirtualHost>
m2 中 httpd.conf 的摘录:
<VirtualHost *:9002>
ProxyRequests On
ProxyPreserveHost On
ProxyPass / http://h3:9003/
ProxyPassReverse /a/b/ http://h3:9003/
</VirtualHost>
我使用 curl 命令测试此配置:
curl -L -i http://h1:7080/a/b/c
结果:
HTTP/1.1 302 Found
Date: Wed, 09 Dec 2015 13:49:15 GMT
Server: Jetty(9.3.5.v20151012)
Location: http://h1:9001/d
Content-Length: 0
HTTP/1.1 404 Not Found
Date: Wed, 09 Dec 2015 13:49:15 GMT
Server: Apache/2.4.17 (Unix)
Content-Length: 201
Content-Type: text/html; charset=iso-8859-1
# ERROR BODY (404)
答案1
我找到了问题所在。这是 m1 反向代理中的 ProxyPreserveHost 指令。必须将其设置为 off
我认为正确的配置必须将 ProxyPreserveHost 和 ProxyRequests 指令设置为关闭
最终配置是
<VirtualHost *:9001>
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass /a/b/ http://h2:9002/
ProxyPassReverse /a/b/ http://h2:9002/
</VirtualHost>
和
<VirtualHost *:9002>
ProxyRequests Off
ProxyPreserveHost Off
ProxyPass / http://h3:9003/
ProxyPassReverse /a/b/ http://h3:9003/
</VirtualHost>