Apache 条件代理传递

Cha*_*ala 6 apache .htaccess proxypass

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

    ProxyPass        /phpmyadmin !
    ProxyPass / http://localhost:8080/
    ProxyPassReverse / http://localhost:8080/
Run Code Online (Sandbox Code Playgroud)

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

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

http://localhost/web/?_escaped_fragment_=/health
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:8082/web/?_escaped_fragment_=/health
Run Code Online (Sandbox Code Playgroud)

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

http://localhost/web/#!/health
Run Code Online (Sandbox Code Playgroud)

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

ezr*_*a-s 3

由于 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/
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有关更多详细信息,请参阅官方文档的说明: 重写标志 mod_rewrite