【问题标题】:How to server static files + proxy context如何服务器静态文件+代理上下文
【发布时间】:2015-02-11 04:04:52
【问题描述】:

我想知道如何配置我的 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 指令,但我无法使其正常工作。

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

    嗯,其实很安静……

    配置此类文件夹:

    /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
    

    【讨论】:

    • 我遇到了类似的情况,但无法成功,您能帮帮我吗? stackoverflow.com/questions/48671458/…
    • 这不是很清楚这必须放在哪个文件中,我使它工作将此代码插入位于 /sites-available 目录中的 conf 文件中,也许它在 .htaccess 中也可以工作,我没试过。
    【解决方案2】:

    我发现以下方法可行且非常通用。 (2018 年 4 月 12 日)

    Location/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>
    

    【讨论】:

      【解决方案3】:

      现有的两个答案都依赖于正则表达式。虽然它们可以工作,但无需如此复杂的结构就可以做到这一点。 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”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-27
        • 1970-01-01
        • 2021-04-23
        • 2013-12-08
        • 2020-05-18
        • 1970-01-01
        • 2021-03-25
        • 2014-11-17
        相关资源
        最近更新 更多