何时使用哪个mod_rewrite规则进行自我路由?

时间:2012-09-24 19:27:09

标签: mod-rewrite url-routing

有几种方法可以为自路由编写mod_write规则。目前我正在使用这个:

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css)$
RewriteRule ^.*$ index.php [NC,L]

但我也可以使用

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) index.php

OR

ErrorDocument 404 /index.php

可能还有更多。

使用其中一个例子有什么缺点吗?

是否存在一个规则比另一个规则更有意义的用例?

您能否详细解释这些规则之间的区别?

感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:2)

当你的条件是:

RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css)$

然后只有图片,图标,样式和javascript被排除在路由之外。这意味着您无法访问静态html,目录或目录索引。因此,如果您只是想在某个地方放置一个静态html页面,并在没有通过index.php进行路由的情况下提供服务。这也意味着如果你不小心把一个图像或脚本或样式放在错误的地方,并尝试访问它(你通常会得到404),它不会通过index.php eventHough路由,并会产生默认的404错误页。

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

这些条件将排除指向现有资源的任何URI。因此,如果您在文档根目录中的任何位置绘制图像,脚本或目录,静态html等,您将能够在没有通过index.php路由的情况下前往那里。有时候还会包含条件RewriteCond %{REQUEST_FILENAME} !-s,这会排除指向符号链接的URI。这通常是你在路由时看到的,wordpress使用它。

ErrorDocument 404 /index.php

这与之前的条件基本相同,只是它在mod_rewrite之外,并且无法在将来或根据需要强加其他条件。在mod_rewrite之外进行路由的缺点是mod_rewrite和核心指令(在这种情况下是ErrorDocument)在URI文件映射管道中的不同时间对URI进行处理。因此,如果您有执行其他操作的规则,则可以应用它们,然后最终仍然通过index.php进行路由,因为2个指令彼此冲突。仅仅因为重写规则应用于管道中的一个点并不意味着其他指令不会在以后的管道中应用。这是一种不好的路由方式。

还有类似的东西:

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^.*$ index.php [L]

盲目地路由一切。甚至javascript,甚至图像,甚至静态HTML,一切。有时候这就是人们想要的。最终,这将取决于您想要什么以及index.php脚本的功能。它会处理404的吗? (就像你在第一个路由规则中想要的那样),它只是处理非静态资源吗? (就像第二条规则所做的那样),或者它是一个文字捕获所有并将做所有事情(上面的规则是什么)?

另请注意,您的重写标志在第一个和第二个规则之间是不同的。如果你有其他规则,那些很重要。

答案 1 :(得分:0)

第一个例子(你说的是你使用的那个)的最大缺点是这个方法硬编码被排除在被重写为index.php之外的文件扩展名(.js .ico .gif .pnd)。 。这样做的问题是,如果您需要添加使用不在排除列表中的文件扩展名的新静态内容,则必须相应地修改重写规则。例如,如果您要开始托管Flash内容并需要托管.swf和.flv文件,则需要更新现有的重写规则。

中间解决方案是最好的(恕我直言),因为它完全按照它所说的做,即如果请求的文件不存在(!-f condition)OR请求的目录不存在(! -d condition)然后将请求重写为index.php