仅针对代理请求代理静态内容

仅针对代理请求代理静态内容

我在“ ”上有一个 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]

(我没有测试最后的解决方案,因为它似乎只是一种新颖的做事方式......)

相关内容