我想知道如何配置我的httpd服务器以服务于以下页面:
我需要的是当网址为/context/static 时,提供位于我的/var/www/static 中的静态内容,并将其余内容代理到 tomcat 服务器
按此顺序:
/context/static/* --> files served by httpd
/context/* --> resources served by tomcat
我试图将/context/static/* 重写到指向我的/var/www/static 的文件夹中,并为其余部分添加了 ProxyPath
指令,但我无法让它工作。
什么是最佳实践以及如何实现这一目标?
提前致谢
嗯,事实上它很容易...
配置此类文件夹:
/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
我发现以下方法有效且非常通用。 (4/12/2018)
位置/代理传递表达式始终优先于任何其他位置块,因此您必须排除不希望代理的路径。 "?!"在正则表达式中这样做。 由于静态内容是静态的,如果需要直接为不同的媒体类型提供另一个目录,那么要求更新 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>
现有的两个答案都依赖于正则表达式。当它们工作时,可以在没有如此复杂的结构的情况下做到这一点。 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/
这些例外需要放在更一般的规则之前,以便优先。
感谢 freenode 用户在 #httpd 中的"拇指"。