在目标中使用带有 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 有一个有点模糊的功能:将其放在 Location
或 LocationMatch
中将启用 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>
现在,这是否比仅在这种情况下使用 mod_rewrite 更容易维护/理解?也许不吧。但这是一种选择。
【讨论】:
Apache 配置语法实际上不是 XML,所以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 的好方法?