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,在像 Location
或 LocationBlock
这样的上下文块中,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".
我必须将 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,在像 Location
或 LocationBlock
这样的上下文块中,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".