在目标

时间:2016-10-27 15:58:27

标签: apache http-redirect mod-alias

我一直在阅读,在可能的情况下,我不应该使用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

3 个答案:

答案 0 :(得分:9)

如果您使用的是2.4.19或更高版本,则Redirect directive会有一些模糊的功能:将其放在LocationLocationMatch内会启用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。

如果情况不同,请告诉我。