Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mod rewrite 何时使用哪个mod_重写规则进行自路由?_Mod Rewrite_Url Routing - Fatal编程技术网

Mod rewrite 何时使用哪个mod_重写规则进行自路由?

Mod rewrite 何时使用哪个mod_重写规则进行自路由?,mod-rewrite,url-routing,Mod Rewrite,Url Routing,有几种方法可以编写用于自路由的mod_写入规则。目前我正在使用这个: 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 或 可能还有更多 使用这些例子中

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

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

可能还有更多

使用这些例子中的一个有什么缺点吗

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

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


感谢您的时间和帮助。

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


中间的解决方案是最好的(IMHO),因为它完全按照所说的做,即如果请求的文件不存在(!-f条件)
请求的目录不存在(!-d条件),那么当您的条件为:

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\u FILENAME}-还包括
,它不包括指向符号链接的URI。这通常是你在路由时看到的,wordpress使用这个

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

还有这样的东西:

RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^.*$ index.php [L]
这将盲目地路由一切。甚至javascript,甚至图像,甚至静态html,一切。有时候这就是人们想要的。最终,这将取决于您想要什么以及index.php脚本的功能。它能处理404吗?(就像您在第一条路由规则中所希望的那样),它只处理非静态资源吗?(就像第二条规则所做的),或者它是一个字面意义上的“包罗万象”并且会做任何事情(上面的规则所做的)

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

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