我的伺服器上有一個在連接埠 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 的方法。