RewriteRule如何运作?

时间:2010-08-18 14:40:27

标签: mod-rewrite

我只是不明白:

Options +FollowSymlinks -MultiViews
RewriteEngine on
RewriteBase /

RewriteRule ^([a-z]+\-[0-9]+)/?$ $1/home/ [R]
RewriteRule ^[a-z]+\-([0-9]+)/(home|alone)/?$ /$2.php?id=$1 [L]
RewriteRule ^.*$ http://www.anotherdomain.com/ [R=301]

为什么总是处理最后一条规则(最后我的意思是重定向到anotherdomain.com)?。

我需要这样的东西:

http://mydomain.com/some-344 ---> http://mydomain.com/some-344/home/
http://mydomain.com/some-344/ ---> http://mydomain.com/some-344/home/
http://mydomain.com/some-344/home/ ---> home.php?id=344
http://mydomain.com/some-344/alone/ ---> alone.php?id=344
http://mydomain.com/anythingelse... --> http://www.anotherdomain.com/

谢谢!

1 个答案:

答案 0 :(得分:0)

始终处理最后一条规则,因为^.*$将始终匹配。虽然您已在第二条规则上指定了L标记,但它可能是doesn't work quite like you expect

确保在重定向到本地路径时,包含前导斜杠,以及在重定向时,指定L标志以便立即重定向也是一个好主意。目前,这一切都很好,但是如果你看看幕后的处理,它的处理方式比必要的要多得多。

就您的实际问题而言,根据对服务器的原始请求调整全部重定向应该可以获得您想要的内容:

RewriteEngine on
RewriteBase /

RewriteRule ^([a-z]+\-[0-9]+)/?$ /$1/home/ [R,L]
RewriteRule ^[a-z]+\-([0-9]+)/(home|alone)/?$ /$2.php?id=$1

RewriteCond %{THE_REQUEST} !^[A-Z]+\s/[a-z]+\-[0-9]+/(home|alone)/?
RewriteRule ^.*$ http://www.anotherdomain.com/ [R=301,L]