如何解释以下mod_rewrite条件?

时间:2013-01-07 20:25:19

标签: mod-rewrite

我有以下重写条件

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)

我已经阅读了Apache mod_rewrite手册,但是在解释上述内容时遇到了困难。

  1. 我知道条件RewriteCond %{REQUEST_FILENAME} !-f表示所请求的文件名是否缺失

  2. 条件RewriteCond %{REQUEST_FILENAME} !-d表示是否缺少请求的目录。

  3. 我不知道RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)是什么意思

  4. 我的理解是如果条件被评估为真,则应用规则进行条件但是我已经进行条件的规则是RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

    由于我不知道Point 3所指的是什么,如果Point 1评估为true,即如果请求文件丢失,那么我是否正确解释如果请求文件丢失,请点2,即如果请求目录丢失则执行{ {1}}

    修改

    进一步挖掘后,似乎RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]RewriteCond %{REQUEST_FILENAME} !-f表示什么不是文件或目录而不是它们丢失。

2 个答案:

答案 0 :(得分:1)

最后一行是说“请求的URI不会以列出的后缀之一结束。” (严格来说,正如KingCrunch指出的那样,它会检查其中一个后缀是否在字符串中,无论是在结尾还是在中间。)

如果条件为真,则应用规则以下条件;条件之前的规则是分开的,与条件无关。

你是正确的,如果条件1和条件2以及条件3都评估为真,那么将执行以下规则。

分解最后一个正则表达式:

!表示没有,即REQUEST_URI与表达式不匹配;

.*表示任何字符为零次或多次;

\.表示句点(或句号) - 使用反斜杠进行转义,否则.表示任何字符;

(ico|gif|jpg|jpeg|png|js|css)表示由竖线|分隔的其中一个字符串,即“icogifjpg等。”

如果正则表达式以$(字符串结尾标记)结尾,则后缀后面可能没有字符;如现在所写,任何角色都可以跟随。

因此,RewriteCond正在检查REQUEST_URI是否与某些字符不匹配,后跟一个句点,后跟一个列出的文件类型后缀。如果没有,则条件评估为真。

答案 1 :(得分:1)

最后一个条件意味着“当REQUEST_URI不包含[1]'ico','gif','jpg'(等等)时”。当所有三个规则评估为true时,将应用(未显示)RewriteRule

[1]哪种......不完整,因为它应该说“没有结束”,但事实并非如此。但这是一个不同的观点:)