Apache 代理配置(webapp 资源 URL 被截断)

Apache 代理配置(webapp 资源 URL 被截断)

我正在尝试在 Apache Web 服务器中设置代理,但在 URL 构建方面遇到了问题,因为生成的 URL 缺少部分路径。示例:

http://server/webapp/style.css(预期的)

http://server/style.css(真实结果)

我有一台暴露在网络上的服务器(我将其称为前端服务器),还有另一台服务器(后端服务器)位于内部网络(无法从网络访问)中,其中有我想在外部代理的 Web 应用程序。我尝试了一些方法,主要问题是代理中的 URL 未以正确的方式(重新)编写,服务器或浏览器缺少部分。

我尝试过的:

ProxyPass /webapp http://backendserver
ProxyPassReverse /webapp http://backendserver

浏览器中应用程序的 URL 是正确的http://frontendserver/webapp索引.html可见,但所有附加的资源(js、socket、css 等)都丢失,因为它们的 URLhttp://frontendserver/style.css不是http://frontendserver/webapp/style.css


这是正确设置此类代理的正确方法吗?

我也尝试了使用 Apache 重写模块的其他解决方案,但没有得到好的结果,也许有人可以提出解决该问题的好建议。

谢谢

答案1

ProxyPass更改 URL 的应答方式,但不会重写 index.html 中的 URL。要解决该问题,您的选项如下:

  1. 重写 index.html 以使用相对链接 ( css/style.css) 而不是绝对链接 ( /css/style.css),这样它们仍然可以从不同的 URL 基础工作。

  2. 使用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 基础,否则它将失败。

相关内容