我正在尝试在 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。要解决该问题,您的选项如下:
重写 index.html 以使用相对链接 (
css/style.css
) 而不是绝对链接 (/css/style.css
),这样它们仍然可以从不同的 URL 基础工作。使用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 基础,否则它将失败。