问题描述
我的英语很差,这是我的第一个问题,所以希望我做得对;-)
我使用Apache HTTPD 2.4.41(Win64),并且想使用以下LocationMatch-Rule:
<LocationMatch "^/es/(?<ind>.*)/_search$">
AllowMethods GET POST
ProxyPassMatch http://localhost:9200/%{MATCH_IND}/_search
ProxyPassReverse http://localhost:9200
</LocationMatch>
该规则似乎匹配,因为我收到了来自后端服务器(ElasticSearch)的响应。响应正文显示,命名的组反向引用无法正常工作:
GET /es/archives/_search
{
"error": "no handler found for uri [/%25%7BMATCH_IND%7D/_search/es/archives/_search] and method [POST]"
}
似乎命名的组反向引用未被识别,并且已经被直接传递给后端服务器而没有被解释。
至少已附加原始URL(如the doc中所述)。作为一种解决方法,我什至可以这样保留,但我认为这不是实现此目的的正确方法。
任何关于Apache为何无法识别命名组反向引用和变量的原因的想法吗?我的Apache版本(2.4.41)也应该很好,因为2.4.8版中已引入命名组反向引用。
我实际上在Stack Overflow和Google上花费了数小时,以寻找类似的情况,但到目前为止没有任何帮助。
希望,有人可以帮忙!
解决方法
似乎 <LocationMatch>
文档在使用带有 ProxyPass
和 ProxyPassMatch
的匹配表达式时非常模糊。 %{MATCH_*}
表达式似乎不适用于它们。然而,似乎反向引用(即$1
)确实有效。所以你可能想要这样的东西:
<LocationMatch "^/es/(?<ind>.*)/_search$">
AllowMethods GET POST
ProxyPassMatch http://localhost:9200/$1/_search
ProxyPassReverse http://localhost:9200
</LocationMatch>
注意,需要在正则表达式中使用命名组,否则不会填充反向引用。