我想知道下面的mod_rewrite代码是做什么的,有人可以详细解释代码吗?下面的mod_rewrite代码是做什么的?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
我想知道下面的mod_rewrite代码是做什么的,有人可以详细解释代码吗?下面的mod_rewrite代码是做什么的?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]
逐行解释:
RewriteRule .* index.php [L]
将被解释第一和每一个请求相匹配(对主机名和端口后的URL部分匹配,并且查询字符串之前)。 .*
是一个匹配所有时间的正则表达式。更好更快的规则可能是:
RewriteRule^index.php [L]
在正则表达式来^
,每一个都有一个开始字符串相匹配。这相当于.*
- >匹配所有东西。
找到匹配后,处理将继续执行RewriteCond
(itions)。 这两个RewriteConditions链接在一个看不见的逻辑AND
。只有在两个RewriteConditions都为真时,该块才会匹配。
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
如果请求URL example.com/ CSS/base.css以下步骤会发生。
RewriteCond %{REQUEST_FILENAME} !-f
,因为css/base.css
是一个文件。RewriteRule
将被跳过,因为没有发生匹配,如果请求URL example.com/ EN /约以下步骤会发生处理将测试其他规则和条件*。
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
它重写不磁盘上的文件((!-f)
)或目录((!-d)
)匹配的index.php所有请求。 [L]
告诉mod_rewrite在此之后停止处理规则。