在目标中使用带有 HTTP_HOST 的 RedirectMatch

Using RedirectMatch with HTTP_HOST in the destination

我一直在读到,在可能的情况下,我不应该使用 mod_rewrite。因此,我正在尝试使用 RedirectMatch 重写 http 到 https。

问题:如何在URL参数中使用RedirectMatch和Apache服务器变量(如%{HTTP_HOST})?

此代码未能return响应客户端(Chrome):

RedirectMatch ^(.*) https://%{HTTP_HOST}/

我最近问了一个类似的问题,但可能太罗嗦了,缺乏答案的方向:

不,您不能在 Redirect/RedirectMatch 中使用该类型的变量。如果您需要变量,例如 %{HTTP_HOST},请使用 mod_rewrite.

注意:我赞扬您不要立即尝试使用 mod_rewrite,因为即使是最简单的重定向,大多数人也会选择 mod_rewrite,这显然是矫枉过正,而且大多数情况下都是如此只是想让事情不必要地复杂化。

如果您使用的是 2.4.19 或更高版本,Redirect directive has a somewhat obscure feature: putting it inside a Location or LocationMatch will enable expression syntax

所以你的例子可以写成

<LocationMatch ^(?<PATH>.*)>
    Redirect "https://%{HTTP_HOST}%{env:MATCH_PATH}"
</LocationMatch>

(这里,?<PATH> 表示匹配捕获将被保存到名称为 MATCH_PATH 的环境变量中。这就是我们稍后在 Redirect 中使用它的方式.)

如果您总是使用整个请求路径进行重定向,那就更容易了,因为您可以用 REQUEST_URI 变量完全替换捕获组:

<Location "/">
    Redirect "https://%{HTTP_HOST}%{REQUEST_URI}"
</Location>

现在,对于这种情况 maintain/understand 比只使用 mod_rewrite 更容易吗?也许不吧。但这是一个选择。

写给将来可能面临同样问题的用户。

不确定您是如何添加虚拟主机条目的。

我想这个虚拟主机条目是在一些编程脚本的帮助下自动添加的。 您是否将 VhostDirective 与 ServerName 一起使用?

<VirtualHost *:8080>
    ServerName example.domain.com
</VirutalHost>

如果是这样,那么您可以使用相同的域值来填充 RedirectMatch 字段。

如果您手动添加 vhost 条目,只需明确写入域 URL 值而不是 HTTP_HOST。

或者让我知道情况是否不同。