htaccess 仅在域匹配时重定向

Posted

技术标签:

【中文标题】htaccess 仅在域匹配时重定向【英文标题】:htaccess redirect only if domain matches 【发布时间】:2012-05-01 16:12:19 【问题描述】:

我有一个问题,我需要在我的域到达 php 之前重定向它。当它达到执行标头的能力时,为时已晚。

我该怎么办

if (domain == 'www.example.com')
redirect www.domain.com;

在我的 .htaccess 中?

【问题讨论】:

说真的,为什么不能像你写的那样? 以上代码示例为php。我需要它不击中 php 很公平。我只是认为 htaccess 领域特定的语言可能会更加理智。 【参考方案1】:

使用 mod_rewrite

RewriteEngine On
RewriteCond %HTTP_HOST ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R,L]

【讨论】:

我认为 domain.com/$1 的斜线需要删除,因为它已经在 $1 中了 @webjunkie 从 apachee 2.0+ 开始,当用于匹配 htaccess 文件中的规则时,会从 URI 中删除前导斜杠,因为它会自动匹配每个目录。 URI 在服务器或虚拟主机配置中的通过规则仍将带有前导斜杠。 OP 在 htaccess 中询问规则。 哦,好吧,我在服务器配置中使用了这个。但是对于未来的访问者来说可能会很高兴。 @webjunkie 这就是为什么有时,即使它是用于 htaccess,我也会制作正则表达式:^/?(.*)$,以匹配前导斜杠(如果有的话),以防它在其他地方使用。 [NC] 是做什么的?【参考方案2】:

从 Apache 2.4 开始,您可以使用 <If> 指令来实现您的建议:

<If "req('Host') == 'www.example.com'">
  RedirectMatch (.*) http://www.example2.com$1
</If>

对于匹配或不匹配 www 的不区分大小写版本,您可以这样做:

<If "req('Host') =~ /example.com/i">
  RedirectMatch (.*) http://www.example2.com$1
</If>

来源:

Apache 博客:New in httpd 2.4: If, ElseIf, and Else Apache 2.4 文档:If Directive

【讨论】:

这应该是公认的答案 ^^ 我会在其中添加 301RewriteEngine On &lt;If "req('Host') =~ /example.com/i"&gt; RedirectMatch 301 ^(.*) https://www.example2.com$1 &lt;/If&gt;

以上是关于htaccess 仅在域匹配时重定向的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 仅在 GET 参数存在时重定向

.htaccess 重定向仅在浏览器警告后执行

在 Laravel 5.8 中的 htaccess 中重定向 [重复]

.htaccess Joomla -> Community Builder 中的重定向登录组件

htaccess 将所有请求重定向到 index.php,子文件夹除外

基本Cloudfront或S3.htaccess重定向匹配