首页 文章

Apache Conditional Proxy 传递

提问于
浏览
0

我对服务器没有多少经验。所以,这可能是我的 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。这是什么代码?

1 回答

  • 0

    由于 ProxyPass 无法进入 If 语句,因此您需要使用 mod_rewrite 到 proxy/redirect 并使用 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,这是一个标记,表示在原始请求中附加任何查询字符串,但我为了清晰度抖动添加了它,因为在这种情况下_11_无论如何都会默认执行。有关它的更多信息,请在重写标记链接中添加以下内容。

    您可以使此示例更加具体,例如,如果您不希望您可以使用更详细的重写或其他重写来过滤掉,则最后重写将采用任何其他查询字符串。

    有关详细信息,请参阅官方文档的相关内容:重写旗帜 mod_rewrite

相关问题