当您的情况是:
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吗?(就像您在第一个路由规则中想要的那样),它只是要处理非静态资源吗?(就像第二条规则所做的那样),或者它是一个字面上的包罗万象并且会做所有事情(上面的规则是做什么的)?
另请注意,您的重写标志在第一条和第二条规则之间是不同的。如果你有其他规则,这些很重要。