在目标中使用带有HTTP_HOST的RedirectMatch

Tom*_*m17 6 apache mod-alias http-redirect

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

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

此代码无法向客户端(Chrome)返回响应:

RedirectMatch ^(.*) https://%{HTTP_HOST}/$1
Run Code Online (Sandbox Code Playgroud)

我最近向此提出了类似的问题,但它可能过于冗长而缺乏回答的方向:在不使用mod_rewrite的情况下将HTTP流量重定向到Apache中的https

Jac*_*ion 10

如果您使用的是2.4.19或更高版本,则该Redirect指令具有一些模糊的功能:将其置于LocationLocationMatch将启用表达式语法.

所以你的例子可以写成

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

(这里,?<PATH>符号表示匹配捕获将保存到具有名称的环境变量MATCH_PATH.这就是我们以后可以在以后使用它的方法Redirect.)

如果您始终使用整个请求路径重定向,则会更容易,因为您可以使用REQUEST_URI变量完全替换捕获组:

<Location "/">
    Redirect "https://%{HTTP_HOST}%{REQUEST_URI}"
</Location>
Run Code Online (Sandbox Code Playgroud)

现在,这比仅仅使用mod_rewrite更容易维护/理解吗?也许不吧.但这是一个选择.


ezr*_*a-s 7

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

注意:我赞扬你没有立即尝试使用mod_rewrite,因为即使是最简单的重定向,大多数人都会选择mod_rewrite,这显然有点过分,而且大多数时候它只是想要不必要地复杂化.