在目标中使用带有 HTTP_HOST 的 RedirectMatch

Posted

技术标签:

【中文标题】在目标中使用带有 HTTP_HOST 的 RedirectMatch【英文标题】:Using RedirectMatch with HTTP_HOST in the destination 【发布时间】:2017-03-10 09:54:40 【问题描述】:

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

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

此代码未能向客户端(Chrome)返回响应:

RedirectMatch ^(.*) https://%HTTP_HOST/$1

我最近问了一个与此类似的问题,但它可能过于冗长且缺乏答案:Redirecting http traffic to https in Apache without using mod_rewrite

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

【讨论】:

【参考方案2】:

如果您使用的是 2.4.19 或更高版本,Redirect directive 有一个有点模糊的功能:将其放在 LocationLocationMatch 中将启用 expression syntax。

所以你的例子可以写成

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

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

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

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

现在,这是否比仅在这种情况下使用 mod_rewrite 更容易维护/理解?也许不吧。但这是一种选择。

【讨论】:

Apache 配置语法实际上不是 XML,所以 只是意味着 Location 的参数是“/”。在这种情况下,用引号括起来可能更具可读性。 哎呀,输入帖子评论?哎哟。无论如何,感谢您的编辑提示和欢迎! Oof, enter posts the comment? Ouch. 一个“功能”。但是,对于(自己的)新的 cmets,有一个“编辑”选项,有五分钟的宽限期。 我已经在 LocationMatch 中完成了所有这些工作,所以那会很漂亮。唉,我们现在被困在 2.4.6 上,因为我们正在使用 RHEL7。所有的好东西都来了,哈哈。如果有足够令人信服的理由将版本保留在核心 RHEL7 中,我可能会考虑 RedHat Software Collections 版本 (2.4.18)。 FWIW Jacob 之前已经教过我这个例子,但恕我直言,我认为这太复杂了,不能被认为是一个好的答案。【参考方案3】:

不,您不能在 Redirect/RedirectMatch 中使用该类型的变量。如果你需要变量,比如%HTTP_HOST,使用mod_rewrite。

注意:我赞扬您不要立即尝试使用 mod_rewrite,因为即使是最简单的重定向,大多数人也会使用 mod_rewrite,这显然是矫枉过正,而且大多数时候它只是为了使事情变得不必要地复杂化。

【讨论】:

谢谢!这个问题已经在我的脑海中徒劳地烧了一天。在新的实现中,我喜欢尝试“以正确的方式”做事,即使它更难。在这种情况下,mod_rewrite 是!

以上是关于在目标中使用带有 HTTP_HOST 的 RedirectMatch的主要内容,如果未能解决你的问题,请参考以下文章

在多核服务器中使用带有集群的 socket.io 的好方法?

在 IIS URL Rewrite 2.0 中,为啥 HTTP_HOST 包含端口号?

HTTP_HOST 的可靠性如何?

redi安装

无效的http_host标头

Django 无效的 http_host