【问题标题】:Apache ProxyPass errorApache ProxyPass 错误
【发布时间】:2018-02-12 05:20:43
【问题描述】:

我必须将 80 上的所有 apache 请求重定向到 8080 上的 tomcat,除了一个路径。

所以,如果收到http://example.com/anything --> tomcat:8080。

但是,如果 url 是:http://example.com/site --> apache 应该服务并且不需要重定向。

目前,/var/www/html/ 内有一个名为site 的文件夹。

这是我当前的配置文件:

site.conf (此文件仅包含以下内容,位于 conf.d 文件夹内)

<LocationMatch "/*">
        Allow from all
        ProxyPass               /site !  
        ProxyPass               http://127.0.0.1:8080
        ProxyPassReverse        http://127.0.0.1:8080
</LocationMatch>

我认为这是用 apache 完成的一件简单的事情,但我已经尝试了所有我能找到的东西,但我仍然收到错误:

ProxyPass|ProxyPassMatch can not have a path when defined in a location.

问题是根网站在tomcat上运行,而另一个在apache上运行(我在这个问题中称为site)。

如果有人可以提供帮助,我将不胜感激。

谢谢!

更新 1 - 09/06/2017

如果我删除 LocationMatch 并放入 ProxyPass,它就会工作 直接在.conf 文件中:

ProxyPass               /site !
ProxyPassReverse        /site !
ProxyPass               / http://127.0.0.1:8080
ProxyPassReverse        / http://127.0.0.1:8080

但是,我想知道,这是为什么呢?将此指令放在LocationMatch 标记之外有什么影响?而且,最重要的是,为什么我不能使用 LocationMatch 完成相同的结果?

【问题讨论】:

    标签: apache tomcat proxypass


    【解决方案1】:

    我认为错误很明显:

    ProxyPass|ProxyPassMatch can not have a path when defined in a location.
    

    根据the documentation,在LocationLocationBlock 等上下文块内,ProxyPass 指令不接受路径:

    &lt;Location&gt; 部分中使用时,第一个参数被省略,本地目录从&lt;Location&gt; 中获取。在&lt;LocationMatch&gt; 部分中也会发生同样的情况;但是,ProxyPass 不会这样解释正则表达式,因此在这种情况下需要使用 ProxyPassMatch。

    您收到错误是因为您尝试使用路径:

    ProxyPass               /site !  
    

    理论上,您可以尝试通过使用多个 &lt;Location&gt; 部分来解决此问题,如下所示:

    <Location />
        ProxyPass http://backend/
    </Location>
    
    <Location /site>
        ProxyPass !
    </Location>
    

    ordering of these sections is important

    LocationMatch 块之外使用ProxyPass 指令的解决方案可能是最简单的解决方案。


    附带说明,您的 LocationMatch 指令不正确。 LocationMatch 的参数是一个正则表达式,/* 只会匹配仅包含 / 字符的 URL。也就是说,它将匹配//////////// 等。我认为您的真正意思是/.*。正则表达式中的* 表示“前一个字符,零次或多次”。

    【讨论】:

    • 好的,我明白了。谢谢!我将使用Location 尝试您的解决方案。但是,不使用Location,有什么区别?直接在文件中设置这些代理值与为VirtualHost 本身或Directory 设置相同?这种方法有什么问题吗?
    • 如果您只使用 Location 块进行设置,我不确定使用 Location 与仅在配置文件的顶层使用 ProxyPass 有多大区别ProxyPass。我想如果你在Location 部分做的不仅仅是ProxyPass,你可能更愿意将相关的配置元素放在一起。
    猜你喜欢
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2016-08-13
    • 1970-01-01
    • 2017-07-03
    • 2015-11-22
    • 2012-01-30
    相关资源
    最近更新 更多