我在“ ”上有一个 Apache 服务,它运行一个本地应用程序,/
其静态文件位于“ /static
”上
另一个应用程序mod_proxy
:
ProxyPreserveHost On
ProxyPass "/example" "http://127.0.0.1:9090/"
ProxyPassReverse "/example" "http://127.0.0.1:9090/"
这个应用程序本身确实有静态内容“ /static
”,但是当它通过代理时,会从第一个应用程序中提取文件。
有没有办法/static
根据请求的来源为每个人提供“ ”服务?
答案1
根据您的例子,我希望在使用代理时http://127.0.0.1:9090/static
可以访问位于的 tomcat 静态文件。http://127.0.0.1/example/static
可能的解决方案 1
我认为最佳实践的解决方案是将 tomcat 应用程序中的绝对路径改为使用相对路径,因此静态文件使用后者的路径;
<img src="static/my_image.jpg"></img>
或服务器根相关;
<img src="/example/static/my_image.jpg"></img>
这将正确地提供图像,例如
http://127.0.0.1/example/static/my_image.jpg
可能的解决方案
将 apache 静态文件重命名为其他名称,并明确将 /static 路径代理到 tomcat;
# move the locate apache static files to somewhere else;
# http://127.0.0.1/static_apache etc
ProxyPass /static http://127.0.0.1:9090/static
ProxyPassReverse /static http://127.0.0.1:9090/static
ProxyPass "/example" "http://127.0.0.1:9090"
ProxyPassReverse "/example" "http://127.0.0.1:9090"
另请注意:
订购 ProxyPass 指令
按照配置顺序检查已配置的 ProxyPass 和 ProxyPassMatch 规则。匹配的第一个规则获胜。因此,通常您应该首先从最长的 URL 开始对冲突的 ProxyPass 规则进行排序。否则,较长 URL 的后续规则将被任何使用 URL 前导子字符串的较早规则隐藏。
可能是黑客的解决方案
通过检查 referer 头来检测请求是否从 tomcat 应用程序发起;
RewriteEngine on
# match the app in the referer before processing the rule
RewriteCond %{HTTP_REFERER} /example
# reverse-proxy the request to the back-end
RewriteRule ^/static(/.*)?$ http://127.0.0.1:9090/static$1 [P]
(我没有测试最后的解决方案,因为它似乎只是一种新颖的做事方式......)