标签: locationmatch

如何组合LocationMatch和ProxyPassMatch?

我正在内部机器上设置Apache 2.4.6服务器以进行测试.Apache服务器应该做的事情之一是作为localhost上的另一个服务器的反向代理:3030.

localhost:3030上的服务器在其第一个路径级别上需要一个数据集名称中的一个(目前,该集合仅包含数据集experimental,但稍后将添加更多数据集),因此我试图将其传递给请求的路径.

在我的vhost中,这有效:

<Location /experimental/>
    ProxyPass http://localhost:3030/experimental/
    ProxyPassReverse /
</Location>
Run Code Online (Sandbox Code Playgroud)

对于其他数据集,我可以复制它并替换experimental为其他数据集名称.显然,这会导致大量代码重复/冗余,这既是错误的根源,也是维护恐怖.

因此,我希望变得更灵活,并在一个这样的块中处理几个数据集.使用该LocationMatch指令应该可以实现.

正如本评论本页所示,我需要在块内使用时替换.从本质上讲,文档陈述相同:ProxyPass ProxyPassMatchLocationMatch

在LocationMatch部分中也会出现相同的情况,但是ProxyPass不会解释regexp,因此在这种情况下需要使用ProxyPassMatch.

LocationMatch文档解释:

从2.4.8开始,命名组和反向引用被捕获并写入环境,其对应的名称前缀为"MATCH_",大写.这允许从表达式和模块(如mod_rewrite)中引用URL元素.为了防止混淆,忽略编号(未命名)的反向引用.请改用命名组.

该信息仅在Apache 2.4.8中有效,这可能是以下原因导致我的2.4.6安装不起作用的原因:

<LocationMatch /(?<dataset>experimental)/>
    ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/
    ProxyPassReverse /
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

另一方面,这个页面那个帖子暗示数字组索引($1)可以使用(因为帮助文本只有httpd 2.4.8有效,我怀疑/希望是数字参考在2.4.8之前工作(?)

无论如何,我试过这个:

<LocationMatch "/(experimental)/">
    ProxyPassMatch http://localhost:3030/$1/
    ProxyPassReverse /
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

但根据日志,内部调用将调用http://localhost:3030/$1/而不是http://localhost:3030/experimental/在请求experimentalvhost URL上的路径时调用.

ProxyPassMatch文档只能说:

在LocationMatch部分中使用时,将省略第一个参数,并从LocationMatch获取正则表达式.

但是,该文本并没有提供如何组合LocationMatch …

apache proxypass locationmatch

12
推荐指数
1
解决办法
1万
查看次数

Apache,LocationMatch:匹配查询字符串

如何使用LocationMatchapache 匹配查询字符串?

<LocationMatch "/index.php\?a=b.*">
// ...
Run Code Online (Sandbox Code Playgroud)

......不幸的是不行.

apache locationmatch query-string

5
推荐指数
1
解决办法
4882
查看次数

HTAccess LocationMatch服务器错误

我正在尝试使用它.htaccess来更改RewriteBase位置是本地服务器还是实时服务器.

Options +FollowSymlinks
RewriteEngine on

<LocationMatch "^/(bbtsrv02)/$">
    #RewriteBase /beta/admin/
</LocationMatch>

RewriteCond %{REQUEST_URI} !index.php$
RewriteCond %{REQUEST_URI} !css/(.*)\.
RewriteCond %{REQUEST_URI} !img/(.*)\.
RewriteCond %{REQUEST_URI} !incs/(.*)\.
RewriteCond %{REQUEST_URI} !js/(.*)\.
RewriteCond %{REQUEST_URI} !upload/(.*)\.
RewriteCond %{REQUEST_URI} !widget/(.*)\.
RewriteRule ^(.*) index.php?_pd=$1 [NC,L]
Run Code Online (Sandbox Code Playgroud)

一旦我删除LocationMatch整个事情再次开始工作.我只需要改变RewriteBase实时测试.

.htaccess local live locationmatch

5
推荐指数
1
解决办法
8758
查看次数

Apache LocationMatch 正则表达式

我的问题

我需要有Apache HTTP Server (v2.4.10) 代理对Tomcat 的动态应用请求,这不仅与Tomcat 中的路径不匹配,而且彼此的路径也相似。例如:

/products/<category>/<sub-category>/<sub-sub-category>/<product-id>.html 代理: http://mycluster/pf/<product-id>.html

...并且...

/products/<category>/<sub-category>/<sub-sub-category>/<anything-not-ending-in-html> 代理: http://mycluster/search/<anything-not-ending-in-html>

我的尝试

我正在尝试使用 LocationMatch 正则表达式来处理这个问题,但并没有完全成功。以下 LocationMatch 正则表达式自行工作(将*.html请求代理到<tomcat>/pf/*.html):

<LocationMatch ^/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)/(?<partnum>.+).html>
ProxyPass balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
ProxyPassReverse balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

这使用以下示例路径传递 URL:(/products/aaa/bbb/ccc/ddd3456.html这是正确的)

但是,当我还启用下面的正则表达式时:

<LocationMatch ^(?!.*\.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

尝试访问/products/aaa/bbb/ccc/404 页面中的结果。在这里,我期待对“/products/aaa/bbb/ccc/”的任何不以 .html 结尾的请求传递给 /search/(包括要包含的任何后续路径信息:例如 .../search/相比 )

我的问题

我无法完全弄清楚出了什么问题。根据Rubular提供的正则表达式是正确的:

我在这里缺少什么?

我很感激任何关于解决这个问题的建议!

regex apache proxy mod-proxy locationmatch

5
推荐指数
1
解决办法
4万
查看次数