Apache-2.4
兩個帶有 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
。網址翻譯如下:(m1) http://h1:9001/a/b/d -> (m2) http://h2:9002/d -> (m3) http://h3:9003/d
我的配置適用於此請求。
問題是當我嘗試從 web c 到 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)
我發現了問題。它是 m1 反向代理中的 ProxyPreserveHost 指令。必須設置為關閉
我認為正確的配置必須將指令 ProxyPreserveHost 和 ProxyRequests 設置為 off
最終的配置是
<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>