如何使用反向代理正確處理相對 url
我在 Apache 中有如下反向代理設置:
地址為 www.example.com/folder 的伺服器 A 是反向代理伺服器。
它映射到:地址為 test.madeupurl.com 的伺服器 B
這種作品。但我遇到的問題是,在 www.example.com/folder 上,所有相關連結的形式都是 www.example.com/css/examplefilename.css 而不是 www.example.com/folder/css/examplefilename。 css
我該如何解決?
到目前為止,我的反向代理在伺服器 A (www.example.com) 上有這個:
<Location /folder> ProxyPass http://test.madeupurl.com ProxyPassReverse http://test.madeupurl.com </Location>
Apache ProxyPassRewrite 不會重寫從http://test.example.com收到的響應正文,僅重寫標題(如重定向到 404 頁面等)。
多種選擇:
一)重寫內部應用程序以使用相對路徑而不是絕對路徑。即
../css/style.css
代替/css/style.css
二)將內部應用程序重新部署在同一子目錄
/folder
中,而不是在 test.example.com 的根目錄中。三)一個和兩個通常不太可能發生……如果你很幸運,內部應用程序只使用兩個或三個子目錄***,而這些子目錄在你的主站點上沒有使用***,只需編寫一堆 ProxyPass 行:
# Expose Internal App to the internet. ProxyPass /externalpath/ http://test.example.com/ ProxyPassReverse /externalpath/ http://test.example.com/ # Internal app uses a bunch of absolute paths. ProxyPass /css/ http://test.example.com/css/ ProxyPassReverse /css/ http://test.example.com/css/ ProxyPass /icons/ http://test.example.com/icons/ ProxyPassReverse /icons/ http://test.example.com/icons/
四)為內部應用程序創建一個單獨的子域並簡單地反向代理所有內容:
<VirtualHost *:80> ServerName app.example.com/ # Expose Internal App to the internet. ProxyPass / http://test.internal.example.com/ ProxyPassReverse / http://test.internal.example.com/ </VirtualHost>
五)有時開發人員完全一無所知,他們的應用程序不僅生成絕對 URL,甚至在其 URL 中包含主機名部分,生成的 HTML 程式碼如下所示
<img src=http://test.example.com/icons/logo.png>
:A ) 您可以使用水平分割 DNS 和方案 4 的組合解決方案。內部和外部使用者都使用 test.example.com,但您的內部 DNS 直接指向 test.example.com 的伺服器的 IP 地址。對於外部使用者,test.example.com 的公共記錄指向您的公共網路伺服器 www.example.com 的 IP 地址,然後您可以使用解決方案 4。
B ) 實際上,您不僅可以讓 apache 代理對 test.example.com 的請求,還可以在將響應正文傳輸給您的使用者之前重寫響應正文。(通常代理只重寫 HTTP 標頭/響應)。apache 2.2 中的 mod_substitute。我還沒有測試它是否與 mod_proxy 很好地堆疊,但也許以下工作:
<Location /folder/> ProxyPass http://test.example.com/ ProxyPassReverse http://test.example.com/ AddOutputFilterByType SUBSTITUTE text/html Substitute "s|test.example.com/|www.example.com/folder/|i" </Location>