Apache-2.4

兩個帶有 apache 2.4 和 mod_proxy 的反向代理

  • December 9, 2015

我正在嘗試使用兩個代理配置環境。這個想法是第一個代理重定向到第二個,第二個重定向到最終的網路。

該配置適用於正常請求。但我對 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>

引用自:https://serverfault.com/questions/741851