将 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
您需要使用
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
标志之外):
/anotherapp
也会被抓住。但这也被丢弃了。project=mine
匹配查询字符串中任何位置的该字符串,即使作为其他 URL 参数的一部分也是如此。例如。 fooproject=miner
也会匹配。localhost:8080
不是有效的替换字符串。