两个带有 apache 2.4 和 mod_proxy 的反向代理

两个带有 apache 2.4 和 mod_proxy 的反向代理

我正在尝试配置一个具有两个代理的环境。想法是第一个代理重定向到第二个代理,第二个代理重定向到最终网站。

该配置适用于正常请求。但我遇到了 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>

相关内容