我正在嘗試在 Apache Web 伺服器中設定代理,但我遇到了有關 URL 建置的問題,因為路徑的結果 URL 部分遺失了。一個例子:
http://server/webapp/style.css
(預期的)
http://server/style.css
(真實結果)
我有一個暴露在網路上的伺服器(我稱之為前端伺服器)和內部網路中的另一台伺服器(後端伺服器)(無法從網路存取),其中有我想要在外部代理程式的網路應用程式.我嘗試了一些方法,主要問題是代理中的 URL 沒有以正確的方式(重新)編寫,伺服器或瀏覽器遺漏了一部分。
我嘗試過的:
ProxyPass /webapp http://backendserver
ProxyPassReverse /webapp http://backendserver
瀏覽器中應用程式的 URL 正確http://frontendserver/webapp
;這索引.html可見,但所有附加資源(js、套接字、css 等)均遺失,因為它們的 URLhttp://frontendserver/style.css
不是http://frontendserver/webapp/style.css
.
這是正確設定此類代理的正確方法嗎?
我也使用 Apache 重寫模組嘗試了其他一些解決方案,但沒有達到好的結果,也許有人有一個很好的建議來解決這個問題。
謝謝
答案1
ProxyPass
更改 URL 的應答方式,但不會重寫 index.html 中的 URL。要解決該問題,您的選擇是:
重寫 index.html 以使用相對連結 (
css/style.css
) 而不是絕對連結 (/css/style.css
),因此它們仍然可以在不同的 URL 基礎上工作。使用mod_proxy_html重寫傳出 HTML、Javascript 和 CSS 內容中的連結。就像是:
<Files *.html> ProxyHTMLEnable On ProxyHTMLLinks a href ... ProxyHTMLURLMap http://frontendserver/ http://frontendserver/webapp/ </Files>
如果您可以輕鬆做到,第一個解決方案是最好的,因為它使您的內容可移植且更可靠。
如果您內容中的所有 URL 都是靜態的,則第二個解決方案可能適合您。但是 mod_proxy_html 對動態計算的 URL 一無所知 - 例如,如果您在 Javascript 中計算 URL。因此,在這種情況下,除非您也修改程式碼以使用動態 URL 庫,否則它將失敗。