以下mod_rewrite代码有什么作用?

时间:2010-12-19 22:38:03

标签: mod-rewrite

我想知道以下mod_rewrite代码做了什么,有人可以详细解释代码吗?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

2 个答案:

答案 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 ,则会执行以下步骤。

  1. 匹配RewriteRule(始终匹配)
  2. RewriteCond %{REQUEST_FILENAME} !-f不匹配,因为css/base.css是一个文件。
  3. RewriteRule将被跳过,因为没有匹配,处理将测试其他规则和条件*
  4. 如果您请求网址example.com/ en / about ,则会执行以下步骤。

    1. 匹配RewriteRule(始终匹配)
    2. 匹配RewriteCond %{REQUEST_FILENAME} !-f,因为en/about不是文件。
    3. 匹配RewriteCond %{REQUEST_FILENAME} !-d,因为en/about不是目录。
    4. RewriteRuleRewriteCond的组合创建了一个正匹配 - >
    5. 使用标记index.php
    6. 将请求重定向到L

      标记L表示最后一条规则,它将停止处理。更多关于flags

      此规则组合通常用于将所有请求重定向到Web应用程序的单个入口点。为避免按index.php提供静态内容,文件和目录将由Web服务器提供,而不是由index.php提供。动态站点请求的调度将在index.php的逻辑内完成。

      *可以找到正确的数据流here

答案 1 :(得分:3)

它将所有与磁盘上的文件((!-f))或目录((!-d))不匹配的请求重写为index.php。 [L]告诉mod_rewrite在此之后停止处理规则。