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

Giovanni 的回答让我走上了正确的道路。我需要补充

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。

相关内容