如何服务器静态文件+代理上下文

时间:2014-12-12 12:30:50

标签: apache mod-rewrite reverse-proxy httpd.conf mod-proxy

我想知道如何配置我的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>

最佳做法是什么以及如何实现?

提前致谢

3 个答案:

答案 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”。