我正在使用这样的东西......
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
由于
答案 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)
如果他们专门要求该地址,那就告诉它忽略该规则。