2010-01-20 144 views
25

鉴于这些情况(我知道他们的意思/做):mod_rewrite:这个RewriteRule做什么?

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 

什么是第一规则呢?那孤独的冲刺是什么?

RewriteRule ^.*$ - [NC,L] 
RewriteRule ^.*$ /index.php [NC,L] 

我一直在使用这一段时间与Zend框架组合,但我从来没有真正得到第一项规则究竟是什么。

回答

46

RewriteCond directive只是描述了RewriteRule directive的附加条件。因此RewriteCond必须始终与RewriteRule关联。

在你的情况这三个RewriteCond可能属于第一RewriteRule这样的:

RewriteCond %{REQUEST_FILENAME} -s [OR] 
RewriteCond %{REQUEST_FILENAME} -l [OR] 
RewriteCond %{REQUEST_FILENAME} -d 
RewriteRule ^.*$ - [NC,L] 

现在,如果RewriteRule的模式当前请求的URL匹配此规则适用(每个目录路径之前剥离)如果条件满足,则为

在这种情况下,如果映射请求URL到它要么与文件大小大于0(-s),或一个符号链接(-l)或目录的现有文件相匹配的文件系统时的条件是唯一的真正(-d )。因此,您的规则将应用于任何可映射到文件系统中存在的URL的任何URL(^.*$匹配任何内容)。替代-只是意味着不改变任何东西。和NC任何情况下,不区分大小写,无用在这种情况下),并大号(如果应用的最后一个规则)是flags修饰任一图案,更换或规则的执行。

+0

Aaahh是的,这是有道理的。非常明确的解释。谢谢。 – 2010-01-20 15:02:29

+0

那么不改变它的目的是什么?两个重写规则的组合是否表示“是否存在,显示它,否则将其他所有内容转发到index.php” – 2014-10-20 10:57:29

+1

@WillshawMedia是的,所提到的规则基本上保留了对现有文件的任何请求不变,并退出重写过程。所以结合其他规则:只将任何不存在的文件重写为* index.php *。 – Gumbo 2014-10-20 14:49:21