Apache2虚拟主机反向代理重写资产链接

我有一个Web应用程序运行在我的服务器端口8080上:myip:8080 / app

我有我的httpd.conf中的以下configuration

<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链接仍然指向/应用程序/ …返回主HTML页面,而不是资产。

我错过了什么? 我在正确的轨道上还是有一个完全不同(更好)的方式来实现这一目标?

该应用程序是Ubuntu 12.04上的Tomcat 7中的Tapestry Web应用程序。

任何关于performance的见解都会很有趣。

ProxyPassReverse仅适用于HTTP头(例如:301redirect)。

要启用HTML重写,您需要通过以下方式启用它:

 ProxyHTMLEnable On ProxyHTMLURLMap /app/ / 

但是,现代Web应用程序可以很容易地理解由反向代理所做的HTTP请求所发生的情况,在这种情况下,通常不需要在代理级别进行额外的调整。

请记住, mod_proxy_html在处理这些请求时添加一些开销。

乔万尼的回答使我走上了正轨。 我需要补充

 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> 

我还需要修改Cookiepath( ProxyPassReverseCookiePath /app / )以使Tomcat会话Cookie正常工作。

你的web应用程序myip:8080/app可能在HTML和JS中有很多绝对path,以/app/...开始,这些path不能全部被mod_proxy_html捕获和重写。

我build议先尝试让你的应用程序运行在不同的本地URL,如myip:8080/blah 。 启动浏览器的开发人员工具栏,并检查networking选项卡中是否仍然在/app/...请求的文件,并修复它们,直到它们在两个URL(/ blah和/ app)上工作。

目标应该是,你的应用程序中的所有链接是相对的,即指定为

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

而不是像这样的东西

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

同时检查<base>标签以覆盖默认的基本URL。