.htaccess RewriteCond REQUEST_FILENAME

时间:2013-12-13 01:34:23

标签: .htaccess mod-rewrite

我在从第三方(vBSEO)创建的.htaccess文件中有以下内容:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !/(admincp|modcp|clientscript|cpstyles|images)/
RewriteRule ^(.+)$ vbseo.php [L,QSA]

如果我已经确定第2行的目录不存在,为什么需要第三行(“如果REQUEST不是这个特定的目录”)?不排队两个状态,“如果请求不是目录”?

2 个答案:

答案 0 :(得分:3)

第二行确实意味着“请求的文件名不是物理目录”。但是,第三行表示“请求的文件名不包含任何序列/ admincp /或/ modcp / etc”。你看,它是一个正则表达式,因为它不使用锚点^(表示字符串的开头)或$(表示字符串的结尾),它匹配任何仅仅的字符串包含这些目录名称。

所以.htaccess说我们应该将任何请求重定向到vbseo.php,如果它不是现有资源,并且请求的文件名不在任何这些目录中。 /admincp/index.html不会被重定向(假设index.html存在)。请注意,/foo/bar/admincp/baz/qux也不会被重定向。

答案 1 :(得分:1)

如果请求是现有文件或目录的名称,前两行确保没有请求被重定向到vbseo.php。但是,第三行确保请求不会被重定向,即使它们 not 存在,如果它们包含/(admincp | ...)/。

更重要的是,第三行允许在vbseo重定向之后提供非文件或目录的资源

RewriteRule ^blogs$ blogorama.php [L]

如果/ blogs /无法通过文件系统访问,例如。