我一直在阅读,在可能的情况下,我不应该使用mod_rewrite
。因此,我正在尝试使用RedirectMatch进行http到https重写。
问题:如何在URL参数中使用RedirectMatch
并使用Apache服务器变量(例如%{HTTP_HOST}
)?
此代码无法向客户端(Chrome)返回响应:
RedirectMatch ^(.*) https://%{HTTP_HOST}/$1
我最近向此提出了一个类似的问题,但它可能过于冗长而缺乏回答的方向:Redirecting http traffic to https in Apache without using mod_rewrite
答案 0 :(得分:9)
如果您使用的是2.4.19或更高版本,则Redirect
directive会有一些模糊的功能:将其放在Location
或LocationMatch
内会启用expression syntax。< / p>
所以你的例子可以写成
<LocationMatch ^(?<PATH>.*)>
Redirect "https://%{HTTP_HOST}%{env:MATCH_PATH}"
</LocationMatch>
(此处,?<PATH>
表示法意味着匹配捕获将保存到名为MATCH_PATH
的环境变量。这就是我们以后在Redirect
中使用它的方法。)
如果您始终使用整个请求路径重定向,则会更容易,因为您可以使用REQUEST_URI
变量完全替换捕获组:
<Location "/">
Redirect "https://%{HTTP_HOST}%{REQUEST_URI}"
</Location>
现在,这比仅仅使用mod_rewrite更容易维护/理解吗?也许不吧。但这是一个选择。
答案 1 :(得分:7)
不,您不能在Redirect / RedirectMatch中使用该类型的变量。如果需要变量,例如%{HTTP_HOST}
,请使用mod_rewrite。
注意:我赞扬你没有立即尝试使用mod_rewrite,因为大多数人都会选择mod_rewrite,即使是最简单的重定向,这显然有点过分,而且大多数时候它只是想让事情变得不必要。
答案 2 :(得分:0)
为将来可能面临同样问题的用户写作。
不确定您是如何添加虚拟主机条目的。
我猜这个 vhost 条目是在一些编程脚本的帮助下自动添加的。 您是否将 VhostDirective 与 ServerName 一起使用?
<VirtualHost *:8080>
ServerName example.domain.com
</VirutalHost>
如果是这样,那么您可以使用相同的域值来填充 RedirectMatch 字段。
如果您手动添加 vhost 条目,只需明确写入该域 URL 值,而不是 HTTP_HOST。
如果情况不同,请告诉我。