0

我有以下重写条件

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)意思

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

由于我还不知道第 3 点指的是什么,如果第 1 点评估为真,即如果请求文件丢失和第 2 点,即如果请求目录丢失,那么我是否正确解释RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]

编辑

在进一步挖掘之后,它似乎RewriteCond %{REQUEST_FILENAME} !-f意味着RewriteCond %{REQUEST_FILENAME} !-d当任何不是文件或目录并且不是它们丢失的东西时。

4

2 回答 2

1

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

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

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

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

表示不匹配,!即如果 REQUEST_URI 不匹配表达式;

.*指任何字符零次或多次;

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

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

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

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

于 2013-01-07T20:29:34.810 回答
1

最后一个条件表示“当REQUEST_URI不包含 [1] 'ico'、'gif'、'jpg'(等等)之一”。当所有三个规则的计算结果为 时true,将应用(未显示)RewriteRule

[1] 这有点……不完整,因为它应该说“not end in”,但事实并非如此。但这是不同的点:)

于 2013-01-07T20:29:56.017 回答