基于 URL 参数请求的 Apache 代理

Apache Proxy requested based on URL parameter

提问人:Andy Knipp 提问时间:11/18/2023 最后编辑:MrWhiteAndy Knipp 更新时间:11/18/2023 访问量:17

问:

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

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

将会有更多的参数(尽管我将强制执行最后一个参数)。project=mine

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

我试过了

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

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

我没有得到或ProxyPassProxyPassMatch

我错过了什么?

提示/指针/RTFM 表示赞赏

apache mod-rewrite proxypass

评论


答:

0赞 MrWhite 11/18/2023 #1

您需要使用 上的标志将请求传递到 mod_proxy,而不是被视为外部 3xx 重定向(即。“此文档已移动”消息)。PRewriteRule

例如,如果直接在容器中使用:<VirtualHost>

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

该条件检查查询字符串末尾的 URL 参数。仅匹配 URL 路径(如示例所示)。project=mine/myapp

反向引用包含与模式匹配的整个 URL 路径。这仅节省了替换字符串中的重复。$0RewriteRule/myapp


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

初次尝试存在一些问题(除了缺少标志):P

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

评论

0赞 Andy Knipp 11/18/2023
谢谢。我确实意识到我正在放弃我的应用程序,并且绝对不希望这样。我认为这已经向我展示了足以完成我的任务。