什么是.htaccess中这两个重定向的区别以及如何为这两个重定向写一个重定向

时间:2017-01-23 11:51:59

标签: php .htaccess

我为一个客户端完成了新网站,现在我在.htaccess文件中进行所有重定向。我对下面几行中的源URL部分感到有点困惑。 这两条线的工作方式是否相同?

Redirect 301 /shop/contact-us http://www.example.com/contact-us/
Redirect 301 /shop/contact-us/ http://www.example.com/contact-us/

2 个答案:

答案 0 :(得分:1)

如果要将带有多个可选尾部斜杠的/shop/contact-us重定向到http://www.example.com/contact-us,则Redirect指令不太合适。请改用RedirectMatch指令:

RedirectMatch 301 "^/shop/(contact\-us)/?" http://www.example.com/$1/

,其中

  • ^是一个锚,意思是“行首”;
  • /?匹配零个或一个斜杠字符;
  • (contact\-us)是一个捕获组(由$1引用)

注意,正则表达式仅匹配前缀,因为仅使用^锚点。您可以使用$(行尾)锚点来使表达式更严格,例如:

RedirectMatch 301 "^/shop/(contact\-us)/*$" http://www.example.com/$1/

其中/*表示零或多个斜杠。

答案 1 :(得分:-1)

您列出的源网址是唯一且不同的,因为其中包含一个尾部斜杠。

实际上,订单可能与mod别名有关。

如果我们有以下内容:

Redirect 302 '/foo/' 'http://example.com/foo.php'
Redirect 302 '/foo'  'http://example.com/bar.php'

访问/foo/我们会获得http://example.com/foo.php的临时重定向。 如果我们访问/foo,我们会暂时重定向到http://example.com/bar.php

但如果我们改变顺序:

Redirect 302 '/foo'  'http://example.com/bar.php'
Redirect 302 '/foo/' 'http://example.com/foo.php'

访问/foo/,奇怪的是第一个模式/foo将匹配,您最终会以http://example.com/bar.php结束!

我倾向于写更具体(更长的源网址)。

有时我会使用mod别名重定向获得一些非常奇怪的结果。因此,最终使用RedirectMatch编写特定的模式匹配或使用mod重写。

在你的情况下,它看起来好像你想要两个:

/shop/contact-us

/shop/contact-us/

重定向到同一个网址。所以你可以简单地省略一条规则并使用:

Redirect 301 /shop/contact-us http://www.example.com/contact-us/

但也许从历史上看,您已使用这两种模式来访问相同或不同的资源,因此最好同时列出(但更改顺序)。