RewriteRule微妙的差异 - 一个在同一个?

时间:2011-12-14 18:20:02

标签: .htaccess mod-rewrite apache2

我正在努力更好地理解mod_rewrite并且我遇到了一些差异,我认为做同样的事情?在这种情况下,没有现有的文件或目录,并重写到index.php页面。

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .+ - [L]

我需要[OR]还是可以将其关闭?

以下规则有哪些区别或优点?我目前正在使用第一个,但我遇到了像WordPress这样的最后四个:

#currently using
RewriteRule ^(.+)$ index\.php?$1 [L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

1 个答案:

答案 0 :(得分:0)

  

我需要[OR]还是可以将其关闭?

在这种情况下,您需要[OR],因为RewriteCond本身就是 ANDed ,而且请求既不是文件也不是目录(就mod_rewrite而言)

RewriteRule ^(.+)$ index\.php?$1 [L]

这会将文档根目录的所有请求(例如http://domain.com/)重写为index.php的查询字符串,因此http://domain.com/some/path/file.html的请求在内部得到改写为index.php?some/path/file.html

RewriteRule ^index\.php$ - [L]

这是防止重写循环的规则。重写引擎将继续遍历所有规则,直到URI在重写迭代之前和之后(没有查询字符串)相同。如果URI以index.php开头,则只需停止当前的重写迭代( - 执行的操作)。重写引擎在通过规则发送URI之前看到URI是 index.php ,并且在规则为 index.php 之后,重写引擎停止并且所有重写都完成。这可以防止mod_rewrite将事物重写为index.php?index.php,如果不适用于此规则,第一个规则将在第二次通过重写引擎时执行。{/ p>

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

这是万能的。如果永远不会应用第一个规则,并且请求不是针对现有文件或目录,请将请求发送到index.php。虽然在这种情况下,看起来这个规则永远不会被应用。


编辑:

  

如果条件为真,有没有办法忽略某个规则?例如,www.domain.com/some/path> index.php?some / path,但如果URI是www.domain.com/this/path>没有重写?

您必须添加两个条件,一个用于检查以确保所请求的主机不是“www.domain.com”,另一个用于检查URI 是否为' t “/ this / path”:

RewriteCond %{HTTP_HOST} !^(www\.)?domain\.com$  [NC,OR]
RewriteCond %{REQUEST_URI} !^/some/path 

[NC]表示条件的匹配应忽略大小写,因此当有人在其地址栏中输入网址http://WWW.domain.com/时,它将匹配(或者在这种情况下,不匹配)。当“/ some / path”开头时,第二个条件匹配,这意味着对http://domain.com/some/path/file.html的请求将匹配并且不会被重写。如果你想完全匹配“/ some / path”,那么正则表达式必须是!^/some/path$

  

为什么不在!-f和!-d之间的最后一个块中使用[OR]?

这是 -f OR -d 的逻辑否定:“如果文件存在,不要重写,或者如果目录存在,不要重写”如果文件变成“ 不存在,如果目录不存在,则重写“