Apache Proxy 根据 URL 参数请求

问题描述 投票:0回答:1

将 Apache 重新映射到 TC 后端,但我想过滤掉,除非设置了某个参数。

即。

http://server/myapp?project=mine
映射到
http:server:8080/myapp?project=mine

将会有更多参数(尽管我将强制

project=mine
作为最后一个)。

ProxyPassMatch
有效,但不适用于参数。

我试过了

RewriteCond %{QUERY_STRING} project=mine
RewriteRule (.*) localhost:8080

似乎很接近,但在 CURL 中测试我得到:此文档已移动...

我不明白

ProxyPass
ProxyPassMatch

我错过了什么?

感谢提示/指针/RTFM

apache mod-rewrite proxypass
1个回答
0
投票

您需要使用

P
上的
RewriteRule
标志通过 mod_proxy 传递请求,而不是被视为外部 3xx 重定向(即“此文档已移动”消息)。

例如,如果直接在

<VirtualHost>
容器中使用:

RewriteCond %{QUERY_STRING} (^|&)project=mine$
RewriteRule ^/myapp$ http://server:8080$0 [P]

condition 检查查询字符串末尾的 URL 参数

project=mine
。仅匹配 URL 路径
/myapp
(如您的示例中所示)。

$0
反向引用包含与
RewriteRule
模式匹配的整个URL路径。这只是在
substitution
字符串中保存重复的 /myapp


RewriteCond %{QUERY_STRING} project=mine
RewriteRule (.*) localhost:8080

您的初次尝试存在一些问题(除了缺少

P
标志之外):

  • 您正在匹配任何 URL 路径,例如。
    /anotherapp
    也会被抓住。但这也被丢弃了。
  • 正则表达式
    project=mine
    匹配查询字符串中任何位置的该字符串,即使作为其他 URL 参数的一部分也是如此。例如。
    fooproject=miner
    也会匹配。
  • localhost:8080
    不是有效的替换字符串。
© www.soinside.com 2019 - 2024. All rights reserved.