RewriteRule结束时的问号

时间:2009-10-03 09:22:50

标签: .htaccess mod-rewrite

RewriteCond %{QUERY_STRING}  ^id=(.*)$
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1 [R=301,L]
and
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1? [R=301,L]

在第一种情况下结果是
new-site.com/newpage-3?id=3
在第二个 new-site.com/newpage-3

第二次重写规则中的问号是什么意思?

1 个答案:

答案 0 :(得分:8)

?在目的地的末尾(目的地不是正则表达式)意味着没有查询字符串去那个目的地。

RewriteCond %{QUERY_STRING}  ^id=(.*)$
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1 [R=301,L]

如果查询字符串只包含一个id,它会存储随后在目标中使用的值,所以如果你有

http://foo.com/oldpage.php?id=54

你最终会得到

http://new-site.com/newpage-54?id=54

如果你有

RewriteCond %{QUERY_STRING}  ^id=(.*)$
RewriteRule ^oldpage\.php$ http://new-site.com/newpage-%1? [R=301,L]

您将转到同一目的地,但查询字符串为空,所以转到

http://foo.com/oldpage.php?id=54

将最终进入

http://new-site.com/newpage-54