我想知道如何配置我的httpd服务器以提供以下页面:
当url是/ context / static时,我需要提供位于/ var / www / static中的静态内容,并将剩余内容代理到tomcat服务器
按此顺序:
/context/static/* --> files served by httpd
/context/* --> resources served by tomcat
我试图将/ context / static / *重写到指向我的/ var / www / static的文件夹,并为剩下的添加ProxyPath
指令,但我无法使其正常工作。< / p>
最佳做法是什么以及如何实现?
提前致谢
答案 0 :(得分:2)
嗯,事实上它很安静......
配置了这样的文件夹:
/var/www/static/
|- css/*
|- js/*
\ medias/*
以下httpd配置会将static / *重定向到/var/www
,其余的将被代理
# first rewrite for statics
RewriteEngine On
RewriteRule ^/context/static/(.+)$ /static/$1
# then proxy remaining...
ProxyPass /context http://127.0.0.1:8080/context
ProxyPassReverse /context http://127.0.0.1:8080/context
答案 1 :(得分:2)
我发现以下方法有效并且非常通用。 (4/12/2018)
位置/ Proxypass表达式始终优先于任何其他位置块,因此您必须排除您不希望被代理的路径。 “?!”在正则表达式中这样做。由于静态内容是静态的,因此如果需要直接为不同的媒体类型提供另一个目录,则要求更新apache配置并不是那么糟糕。
以下内容取自代理Python Flask应用程序的服务器。
<LocationMatch "^/(?!js|css|media)" >
ProxyPass http://127.0.0.1:5000
ProxyPassReverse http://127.0.0.1:5000
</LocationMatch>
<Location "/">
Require all granted
</Location>
答案 2 :(得分:0)
现有的两个答案都依赖于正则表达式。当它们工作时,可以在没有如此复杂的结构的情况下做到这一点。 ProxyPass
可以将 "!"
作为第二个参数,在这种情况下它不会代理匹配的 URL。例如
ProxyPass /context/static/ !
ProxyPass /context http://127.0.0.1:8080/context
ProxyPassReverse /context http://127.0.0.1:8080/context
或者,有多个排除项,
ProxyPass /js !
ProxyPass /css !
ProxyPass /media !
ProxyPass / http://127.0.0.1:5000/
ProxyPassReverse / http://127.0.0.1:5000/
这些例外需要在更一般的规则之前出现才能优先。
感谢 #httpd 中的 freenode 用户“thumbs”。