Apache ProxyPass错误

5
我需要将所有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.

事情是这样的,根网站正在Tomcat上运行,但另一个网站在Apache上运行(在这个问题中我称之为“网站”)。
如果有人能帮忙,我会非常感激。
谢谢!
更新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个回答

6

我认为错误非常明显:

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

根据文档,在类似于LocationLocationBlock的上下文块中,ProxyPass指令不接受路径:

当在<Location>段内使用时,省略第一个参数并从<Location>获取本地目录。在<LocationMatch>段内也会发生同样的情况;然而,ProxyPass不将regexp解释为这样的情况,因此在这种情况下需要使用ProxyPassMatch。

因为您尝试使用路径,所以出现了错误。
ProxyPass               /site !  

您可以尝试使用多个部分来理论上解决这个问题,就像这样:
<Location />
    ProxyPass http://backend/
</Location>

<Location /site>
    ProxyPass !
</Location>

这些部分的排列顺序很重要

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


作为旁注,你的LocationMatch指令是错误的。 LocationMatch的参数是一个正则表达式,而/*只能匹配由/字符组成的URL。 也就是说,它将匹配////////////等。 我认为你真正想要的是/.*。 正则表达式中的*表示“前一个字符,零次或多次”。

好的,我明白了。谢谢!我会尝试使用“位置”来解决问题。但是,如果不使用“位置”,有什么区别呢?在文件中直接设置这些代理值与为“VirtualHost”本身或“Directory”设置相同吗?这种方法有什么问题吗? - Luiz
如果您只是使用Location块来设置ProxyPass,那么在配置文件的顶层使用Location与仅使用ProxyPass相比可能没有太大区别。我想,如果您在Location部分中除了ProxyPass之外还要做更多事情,那么您可能更喜欢将相关的配置元素放在一起。 - larsks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接