Apache2虛擬主機反向代理重寫資產鏈接

Apache2虛擬主機反向代理重寫資產鏈接

我的伺服器上有一個在連接埠 8080 上運行的 Web 應用程式: myip:8080/app

我的 httpd.conf 中有以下配置

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass /app http://localhost:8080/app/
 ProxyPassReverse /app http://localhost:8080/app/
</VirtualHost>

這工作正常,並使該應用程式可以在 subdomain.mydomain.com/app 上使用

現在我正在努力使其在 subdomain.mydomain.com 上可用(沒有 /app)。我第一次嘗試

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
</VirtualHost>

並且還添加了

ProxyHTMLURLMap /app/ /

但兩者似乎都不起作用。主頁加載,但所有 javascript 和 CSS 連結仍然指向 /app/...,它會傳回主 html 頁面而不是資產。

我缺什麼?我走在正確的軌道上還是有完全不同(更好)的方法來實現這一目標?

該應用程式是 Ubuntu 12.04 上 Tomcat 7 中的 Tapestry Web 應用程式。

任何關於性能的見解也會很有趣。

答案1

ProxyPassReverse僅適用於 HTTP 標頭(例如:301 重定向)。

要啟用 HTML 重寫,您需要透過以下方式啟用它:

ProxyHTMLEnable On
ProxyHTMLURLMap /app/ /

然而,現代 Web 應用程式可以輕鬆地了解反向代理髮出的 HTTP 請求發生了什麼,並且在這種情況下通常不需要在代理程式層級進行額外的調整。

請記住,這mod_proxy_html會在處理這些請求時增加一些開銷。

答案2

喬瓦尼的回答讓我走上了正軌。我需要添加

ProxyHTMLEnable On

或者更準確地說(對於我的 mod_proxy_html 版本)等效的

SetOutputFilter INFLATE;proxy-html;DEFLATE

不過,我決定將它與重寫結合使用(因為我無法讓 Tapestry 事件連結以任何其他方式工作):

<VirtualHost *:80>
 ServerName subdomain.mydomain.com
 ServerAlias mydomain.com
 ProxyRequests Off
 ProxyPreserveHost On
 SetOutputFilter INFLATE;proxy-html;DEFLATE     
 ProxyPass / http://localhost:8080/app/
 ProxyPassReverse / http://localhost:8080/app/
 ProxyHTMLURLMap /app/ /     
 ProxyPassReverseCookiePath /app /
 RewriteEngine on
 RewriteRule ^/app/(.+) /$1 [R,L]
</VirtualHost>

我還需要調整 cookie 路徑 ( ProxyPassReverseCookiePath /app /) 以使 Tomcat 會話 cookie 正常運作。

答案3

您的 Web 應用程式myip:8080/app可能有很多以 HTML 和 JS 開頭的絕對路徑,/app/...這些路徑無法全部被 捕獲和重寫mod_proxy_html

我建議先嘗試讓您的應用程式在不同的本地 URL(例如myip:8080/blah.啟動瀏覽器的開發人員工具列,檢查網頁標籤中是否有仍在請求的文件,/app/...並修復它們,直到它們在兩個 URL(/blah 和 /app)上都能運作。

目標應該是應用程式中的所有連結都是相對的,即指定為

<script type="text/javascript" src="file.js"></script>

而不是這樣的東西

<script type="text/javascript" src="/app/file.js"></script>

另請查看<base>標記用於覆蓋預設基本 URL 的方法。

相關內容