Apache Conditional Proxy传递

时间:2016-10-03 10:50:11

标签: apache .htaccess proxypass

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

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

我想为下面的场景实现条件代理传递

如果网址包含?_escaped_fragment_=,则如下面的网址

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

由于ProxyPass无法进入If语句,因此您需要使用mod_rewrite代理/重定向并使用RewriteCond来过滤查询字符串。

由于查询字符串未按要求更改,因此这是一个粗略的示例:

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

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

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

请注意,我添加了QSA,这是一个标记,表示在原始请求中附加任何查询字符串,但我为了清晰度抖动添加了它,因为在这种情况下默认情况下mod_rewrite会默认执行。有关它的更多信息,请在重写标记链接中添加以下内容。

你可以使这个例子更加具体,例如,如果你不希望你可以用更早的更详细的重写或者用另一个重写来过滤它,那么最后一次重写会接受任何其他查询字符串。

有关详细信息,请参阅官方文档的相关内容: Rewrite Flags mod_rewrite