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



我想知道如何配置我的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 中的"拇指"。

最新更新