使用apache mod_rewrite时重写规则顺序对性能的影响

问题描述

|| 虽然我已经了解了“有时是显而易见的方式”,但mod_rewrite处理您提供的各种重写规则(例如:首先阅读RewriteRule,然后再返回以检查RewriteCond),但是: 就性能而言,规则的顺序重要吗? Apache是​​否以“自上而下”的方式处理它们?意味着最常用的规则在技术上应尽可能接近列表的顶部? 这不是关于重叠规则等的问题,因为该问题假定所有规则都是[L]并且不重叠。 所以, 使用最频繁的规则应尽可能靠近顶部,而使用较少的规则应靠近底部? 谢谢!     

解决方法

        从RewriteRule的文档中: http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriterule 定义这些规则的顺序很重要-这是它们在运行时应用的顺序。 因此,如果将常见的重写规则放在顶部,并在可能的情况下用L标志标记它们,则它将不会处理其余规则,并且您将获得优化的配置: last | L-立即停止重写过程,并且不再应用任何规则     ,        @Corey Henderson所说的所有话都是绝对完美的..但并非100%符合现实。 .htaccess中只有这两个规则(我知道,这是一个愚蠢的示例,但是在进行复杂的重写时最终可能会遇到相同的效果):
RewriteEngine On
RewriteRule (.*) /index.php?u=$1 [L]
您可能会想-将所有请求重定向到
index.php
。标志
[L]
已置位,因此无需担心。好吧-显然,这是一件令人担心的事情,因为看到[L]标志后,mod_rewrite进入了下一个迭代(进入循环)。因为我们有始终执行的规则,所以我们将有无限循环(嗯,Apache配置中有设置可以控制它-默认情况下,最多可以进行10次迭代)。如果超过限制,那么您将在Apache \的error.log中看到500服务器错误消息和以下行:\“由于可能的配置错误,”请求超过了10个内部重定向的限制。使用\'LimitInternalRecursion \'增加限制如有必要,请使用\'LogLevel debug \'获取回溯。\“ 重写将在以下情况下停止: 没有更多要处理的规则 外部重定向
[R=301]
给出了明确的“什么都不能重写”命令(第二个参数
RewriteRule
-目标位置应为
-
。 当重写为与迭代开始时完全相同的URL时。 已经提到“请求超出了xx个内部重定向的限制”。 所以是的..重写迭代越快被中断(规则位于顶部)就越好。 在订购规则时(当您有很多规则,而不仅仅是1-2-3时),您可以考虑以下逻辑(规则排在最前面): 在任何情况下都不希望碰到的文件/文件夹规则(按原样处理请求,与域/协议无关) 确实会更改域(例如,重定向到
www.
)或协议(强制HTTPS)的规则-执行此操作越快越好(好像您做得太晚了,它可能已经将URL从\“ nice \”更改为实数) )。 其他可能影响现有文件/文件夹的重要规则 (考虑到此)对于现有文件/文件夹“什么都不需要重写”(请参阅​​下文,第一种,但对于所有现有资源) 其他规定 抓住所有规则。 在绝大多数可以重写URL的网站上,您不会有超过5到6条规则(对于我见过的大多数PHP框架,默认的.htaccess文件都是+一些类似WordPress的产品只是“全部捕获”(如果文件/文件夹不存在,然后将请求重写为index.php))。 每个网站都有其自己的逻辑,这使得上面的列表只是一般性建议,仅此而已。
# Do not do anything for already existing files
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]
我的主要观点是:如果您有很多规则,请考虑将这种“无需重写”插入某处以完全停止迭代。