我必须将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
来完成相同的结果?
答案 0 :(得分:4)
我认为错误非常明确:
ProxyPass|ProxyPassMatch can not have a path when defined in a location.
根据the documentation,在Location
或LocationBlock
等上下文块中,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
的参数是正则表达式,/*
只匹配仅包含/
个字符的网址。也就是说,它会匹配/
或//
或/////////
等。我认为您的确意味着/.*
。正则表达式中的*
表示“前一个字符,零次或多次”。