在目标中使用带有 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。
或者让我知道情况是否不同。
我一直在读到,在可能的情况下,我不应该使用 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。
或者让我知道情况是否不同。