Apache 条件代理通过

Apache Conditional Proxy pass

我对服务器没有太多经验。所以,在我的 Apache 服务器 vim /etc/apache2/sites-enabled/000-default.conf 文件中,这可能是一个愚蠢的 question.Currently,我有一个 proxypass 如下。

    ProxyPass        /phpmyadmin !
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/

我想为以下场景实施条件代理通行证

如果URL包含?_escaped_fragment_=,就像下面的URL

http://localhost/web/?_escaped_fragment_=/health

我希望将此 URL 重定向到具有不同端口的 URL,例如下面的 URL,

http://localhost:8082/web/?_escaped_fragment_=/health

如果URL不包含?_escaped_fragment_=,如下面的URL,

http://localhost/web/#!/health

我之前提到的重定向到端口 8080 的代理传递应该发生。这个的代码是什么?

由于 ProxyPass 不能进入 If 语句,您需要使用 mod_rewrite 到 proxy/redirect 并使用 RewriteCond 来过滤查询字符串。

由于查询字符串没有按要求更改,这里是一个粗略的示例:

RewriteEngine on
RewriteCond %{QUERY_STRING} ^_escaped_fragment_ [NC]
RewriteRule ^/(.*) http://localhost:8082/ [QSA,P,L]
RewriteRule ^/(.*) http://localhost:8080/ [P,L]
ProxyPassReverse / http://localhost:8080/
ProxyPassReverse / http://localhost:8082/

这意味着,如果 query_string 与字符串“_escaped_fragment_WHATEVERHERE”匹配,则将所有内容代理到目标端口 8082 并附加它添加的任何查询字符串。

对于其他情况代理它将代理到localhost:8080。

请注意,我添加了 QSA,这是一个标志,表示在原始请求中附加任何查询字符串,但我添加它是为了清晰起见,因为在这种情况下 mod_rewrite 无论如何都会默认执行此操作。更多信息在重写标志 link 我在下面添加。

您可以使这个示例更加具体,例如 last rewrite 将采用任何其他查询字符串,如果您不希望这样,您可以使用更早的更详细的 rewritecond 或另一个 rewritecond 将其过滤掉。

有关更多详细信息,请参阅官方文档对此的说明: Rewrite Flags mod_rewrite