我有以下重写条件
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
我已经阅读了Apache mod_rewrite手册,但是在解释上述内容时遇到了困难。
我知道条件RewriteCond %{REQUEST_FILENAME} !-f
表示所请求的文件名是否缺失
条件RewriteCond %{REQUEST_FILENAME} !-d
表示是否缺少请求的目录。
我不知道RewriteCond %{REQUEST_URI} !.*\.(ico|gif|jpg|jpeg|png|js|css)
是什么意思
我的理解是如果条件被评估为真,则应用规则进行条件但是我已经进行条件的规则是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
表示什么不是文件或目录而不是它们丢失。
答案 0 :(得分:1)
最后一行是说“请求的URI不会以列出的后缀之一结束。” (严格来说,正如KingCrunch指出的那样,它会检查其中一个后缀是否在字符串中,无论是在结尾还是在中间。)
如果条件为真,则应用规则以下条件;条件之前的规则是分开的,与条件无关。
你是正确的,如果条件1和条件2以及条件3都评估为真,那么将执行以下规则。
分解最后一个正则表达式:
!
表示没有,即REQUEST_URI与表达式不匹配;
.*
表示任何字符为零次或多次;
\.
表示句点(或句号) - 使用反斜杠进行转义,否则.
表示任何字符;
(ico|gif|jpg|jpeg|png|js|css)
表示由竖线|
分隔的其中一个字符串,即“ico
或gif
或jpg
等。”
如果正则表达式以$
(字符串结尾标记)结尾,则后缀后面可能没有字符;如现在所写,任何角色都可以跟随。
因此,RewriteCond正在检查REQUEST_URI是否与某些字符不匹配,后跟一个句点,后跟一个列出的文件类型后缀。如果没有,则条件评估为真。
答案 1 :(得分:1)
最后一个条件意味着“当REQUEST_URI
不包含[1]'ico','gif','jpg'(等等)时”。当所有三个规则评估为true
时,将应用(未显示)RewriteRule
。
[1]哪种......不完整,因为它应该说“没有结束”,但事实并非如此。但这是一个不同的观点:)