RewriteRule和重定向301之间有什么区别

时间:2010-11-29 20:26:40

标签: regex .htaccess

我正在使用这样的东西......

RewriteRule here/(.*) http://www.there.com/$1 [R=301,L] 

但无法让它发挥作用

所以我用了这个......

redirect 301 /here http://www.there.com 

它工作正常。

有人可以解释一下这个区别吗? 你需要两个吗?

另外......如何从重定向中排除路径?

...一样 全部重定向301 ......

redirect 301 /here http://www.there.com 

/here/stayhere.html

由于

3 个答案:

答案 0 :(得分:16)

RewriteRule is handled by Apache's mod_rewrite,而Redirect is handled by mod_alias。不,你不需要两者。

你的RewriteRule(使用正则表达式)将不匹配/here(但会匹配/here/foo.html这样的路径),因为它正在寻找紧接着的斜杠。您可以使用问号进行选择:

RewriteRule ^here(/?.*) http://www.there.com$1 [R=301,L]

现在,它将与您的重定向具有相同的效果。可以添加RewriteCond以排除某些路径:

RewriteCond $0 !/here/stayhere\.html

请注意,某些服务器默认情况下没有打开mod_rewrite。如果在配置中添加RewriteEngine on无法解决问题并且无法打开mod_rewrite,则至少mod_alias提供RedirectMatch指令,这可能已经足够了:

RedirectMatch 301 ^/here(?!/stayhere\.html)(/?.*) http://www.there.com$1

答案 1 :(得分:4)

Redirect匹配路径前缀。以下Redirect匹配前缀(路径段明确)为/here的任何路径,并将其附加到新URI:

Redirect 301 /here http://example.com

因此,路径以/here开头的所有请求都将被重定向到http://example.com,并将/here的任何后续路径后缀追加到http://example.com

相比之下,RewriteRule适用于正则表达式。在这种情况下,以下RewriteRule将匹配包含here/的任何路径:

RewriteRule here/(.*) http://example.com/$1 [R=301,L]

here/之后的任何内容都会附加到新网址。

虽然这两个指令在请求包含以/here开头的路径的网址时会产生相同的效果,但rewriterule也会匹配路径中只包含here/的任何请求,例如/not/here/foo

此外,您只能在mod_rewrite中使用其他条件:

RewriteCond $0 !=here/stayhere.html
RewriteRule ^here(/.*)?$ http://example.com$0 [L,R=301]

如果您希望对mod_alias执行相同操作,则需要将RedirectMatch与正则表达式一起使用,该表达式将匹配/here/stayhere.html以外的任何内容。

答案 2 :(得分:1)

RewriteRule可能不起作用,因为你说的是​​与重定向略有不同的东西。 RewriteRule要求地址包含单词“here”,后跟斜杠。重定向要求地址以斜线显示“here”前面的字样。我会选择这样的东西:

RewriteRule ^here/?(.*) http://www.there.com/$1 [R=301,L]

添加的?使斜杠成为可选项,而开头的^使得“here”必须位于地址的 start ,不在它里面的任何地方。

至于排除某个特定地址,你需要在RewriteRule之前加上这一行:

RewriteCond %{REQUEST_URI} !(here/stayhere\.html)

如果他们专门要求该地址,那就告诉它忽略该规则。