我为一个客户端完成了新网站,现在我在.htaccess文件中进行所有重定向。我对下面几行中的源URL部分感到有点困惑。 这两条线的工作方式是否相同?
Redirect 301 /shop/contact-us http://www.example.com/contact-us/
Redirect 301 /shop/contact-us/ http://www.example.com/contact-us/
答案 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/
但也许从历史上看,您已使用这两种模式来访问相同或不同的资源,因此最好同时列出(但更改顺序)。