Apache ProxyPass 错误

Apache ProxyPass error

我必须将 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?

实现相同的结果

我认为错误很明显:

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

根据 the documentation,在像 LocationLocationBlock 这样的上下文块中,ProxyPass 指令不接受路径:

When used inside a <Location> section, the first argument is omitted and the local directory is obtained from the <Location>. The same will occur inside a <LocationMatch> section; however, ProxyPass does not interpret the regexp as such, so it is necessary to use ProxyPassMatch in this situation instead.

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

ProxyPass               /site !  

您可以尝试使用多个 <Location> 部分在理论上解决此问题,如下所示:

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

<Location /site>
    ProxyPass !
</Location>

ordering of these sections is important.

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


附带说明一下,您的 LocationMatch 指令不正确。 LocationMatch 的参数是一个正则表达式,/* 只会匹配只包含 / 个字符的 URL。也就是说,它将匹配 //////////// 等。我认为您的意思是 /.*。正则表达式中的 * 表示 "the previous character, zero or more times".