多个RewriteCond或多个RewriteRules,效率更高?

时间:2014-04-22 03:53:20

标签: apache .htaccess mod-rewrite rewrite

什么会更有效率?拥有一个RewriteRule [OR]RewriteCond列表:

RewriteCond %{QUERY_STRING} ^id=8[3-9]$ [OR]
RewriteCond %{QUERY_STRING} ^id=9[0-2]$ [OR]
RewriteCond %{QUERY_STRING} ^id=35$
RewriteRule ^index\.php$ /go-here/? [L,R=301,NC]

或多个RewriteRules,每个都有一个RewriteCond

RewriteCond %{QUERY_STRING} ^id=8[3-9]$
RewriteRule ^index\.php$ /go-here/? [L,R=301,NC]    

RewriteCond %{QUERY_STRING} ^id=9[0-2]$
RewriteRule ^index\.php$ /go-here/? [L,R=301,NC]

RewriteCond %{QUERY_STRING} ^id=35$
RewriteRule ^index\.php$ /go-here/? [L,R=301,NC]

我倾向于第一个选项,因为线路较少,但也许是因为参数更复杂,效率会丢失?

1 个答案:

答案 0 :(得分:1)

如果打开重写日志记录,您会注意到的一件事是RewriteRule中的模式首先应用 ,然后如果该模式与URI匹配,则{{ 1}}条件被检查。这意味着对于第一个选项,您总是匹配4次。但是,在第二个选项中,最多只匹配2次,最差的是匹配6次。

因此,至少使用所需匹配数量的度量,取决于您对查询字符串的预期频率。如果RewriteCond发生批次,那么第二个选项可能会更好。如果所有id发生的几乎相同,那么第一个选项可能是最好的。

您应该考虑的另一件事是规则的可读性。如果您在第二个选项中最终拥有大量id=83 / RewriteCond对,则可能更难以阅读,并且当您调整/添加/删除规则时,最终可能会导致问题。

最后,您可能只想要这条规则:

RewriteRule

但我假设你选择了这些条件来说明问题,而且这不是一个现实世界的案例。