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
我对服务器没有太多经验。所以,在我的 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