Apache ProxyPass错误

时间:2017-09-04 01:06:30

标签: apache tomcat proxypass

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

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

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

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

这是我当前的配置文件:

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.

问题是root网站是在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来完成相同的结果?

1 个答案:

答案 0 :(得分:4)

我认为错误非常明确:

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

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

  

<Location>部分内使用时,省略第一个参数,并从<Location>获取本地目录。同样会在<LocationMatch>部分内发生;但是,ProxyPass不会解释regexp,因此在这种情况下有必要使用ProxyPassMatch。

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

ProxyPass               /site !  

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

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

<Location /site>
    ProxyPass !
</Location>

ordering of these sections is important

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

作为旁注,您的LocationMatch指令不正确。 LocationMatch的参数是正则表达式,/*只匹配仅包含/个字符的网址。也就是说,它会匹配////////////等。我认为您的确意味着/.*。正则表达式中的*表示“前一个字符,零次或多次”。