0

有几种方法可以为自路由编写 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

或者

ErrorDocument 404 /index.php

可能还有更多。

使用这些示例之一有什么缺点吗?

有没有一个规则比另一个更有意义的用例?

你能详细解释一下这些规则之间的区别吗?

感谢您的时间和帮助。

4

2 回答 2

2

当您的情况是:

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

然后只有图像、图标、样式和 javascript 被排除在路由之外。这意味着您无法访问静态 html、目录或目录索引。因此,如果您只是想在某处下载一个静态 html 页面,并在没有通过 index.php 路由的情况下提供它。这也意味着如果您不小心将图像、脚本或样式放在错误的位置,并尝试访问它(通常会得到 404),即使它不会通过 index.php 路由,也会产生默认的 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吗?(就像您在第一个路由规则中想要的那样),它只是要处理非静态资源吗?(就像第二条规则所做的那样),或者它是一个字面上的包罗万象并且会做所有事情(上面的规则是做什么的)?

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

于 2012-09-24T19:50:42.787 回答
0

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

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

于 2012-09-24T19:46:34.103 回答