我想知道以下mod_rewrite代码做了什么,有人可以详细解释代码吗?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
答案 0 :(得分:4)
逐行解释:
RewriteRule .* index.php [L]
将首先解释并匹配每个请求(与主机名和端口之后以及查询字符串之前的URL部分匹配)。 .*
是一个始终匹配的正则表达式。更好更快的规则可能是:
RewriteRule ^ index.php [L]
正则表达式中的 ^
表示匹配每个具有开头的字符串。这相当于.*
- >匹配每件事。
找到匹配后,处理将继续RewriteCond
(itions)。
两个RewriteConditions由一个不可见的逻辑AND
链接。只有两个RewriteCondition都为真时,此块才会匹配。
RewriteCond %{REQUEST_FILENAME} !-f # Check if given file is not a file AND
RewriteCond %{REQUEST_FILENAME} !-d # Check if given directory is not a file and
示例:如果服务器上有以下文件结构。
.
|-- css
| `-- base.css
|-- img
| `-- logo.png
`-- index.php
如果您请求网址example.com/ css / base.css ,则会执行以下步骤。
RewriteCond %{REQUEST_FILENAME} !-f
不匹配,因为css/base.css
是一个文件。RewriteRule
将被跳过,因为没有匹配,处理将测试其他规则和条件* 如果您请求网址example.com/ en / about ,则会执行以下步骤。
RewriteRule
(始终匹配)RewriteCond %{REQUEST_FILENAME} !-f
,因为en/about
不是文件。RewriteCond %{REQUEST_FILENAME} !-d
,因为en/about
不是目录。RewriteRule
和RewriteCond
的组合创建了一个正匹配 - > index.php
L
醇>
标记L
表示最后一条规则,它将停止处理。更多关于flags。
此规则组合通常用于将所有请求重定向到Web应用程序的单个入口点。为避免按index.php
提供静态内容,文件和目录将由Web服务器提供,而不是由index.php提供。动态站点请求的调度将在index.php
的逻辑内完成。
*可以找到正确的数据流here
答案 1 :(得分:3)
它将所有与磁盘上的文件((!-f)
)或目录((!-d)
)不匹配的请求重写为index.php。 [L]
告诉mod_rewrite在此之后停止处理规则。