这些改写行是什么意思?

可能重复:
一切你想知道Mod_Rewrite规则,但不敢问?

以下几行是什么意思? 对不起,我是一个正规expression的新学习者。

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteCond %1/%{REQUEST_FILENAME} -f RewriteCond %1/%{REQUEST_FILENAME} -d RewriteRule index.php?=%{REQUEST_FILENAME} [L] 

在阅读了一些Apache重写文档之后,我现在已经有了一些基础知识,但是我还是不能很好地理解上面的一些部分。

%{HTTP_HOST}请求域

[NC] (不区分大小写)

L (上一次停止处理规则)

-f如果Something_to_test是一个文件

-d如果Something_to_test是一个目录

%{REQUEST_FILENAME}请求文件名

  1. ^www\.(.*)$ )中的$是什么意思。 所有客户端请求的URL都是以www.开头的www. 。 我对吗?

  2. %1/%的含义是什么?

  3. RewriteRule index.php?=%{REQUEST_FILENAME}

如果三个RewriteCond都正确,它将执行RewriteRule线。 规则是什么意思?

这些行不是正则expression式,而是mod_rewrite指令 。

要理解这个规则集是干什么的,你需要知道一个规则集是如何处理的 ,以及这些指令是什么意思。 对于后者你应该检查手册中的相应描述。

这样做,你应该看到RewriteRule可能不是它的意图。 因为第一个参数(即index.php?=%{REQUEST_FILENAME} )被解释为正则expression式模式,第二个参数被replace(即[L] )。 这是没有道理的。 它应该可能读取像这样的东西:

 RewriteRule ^ index.php?=%{REQUEST_FILENAME} [L] 

所以我假设以下规则集:

 RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteCond %1/%{REQUEST_FILENAME} -f RewriteCond %1/%{REQUEST_FILENAME} -d RewriteRule ^ index.php?=%{REQUEST_FILENAME} [L] 

这个规则集可以被解释如下:

如果

  • 模式^匹配给定的请求URIpath
  • ^www\.(.*)$匹配HTTP_HOST的值
  • 并且将先前成功的RewriteCond模式匹配与/REQUEST_FILENAME的值连接的第一个子模式(即%1 )的匹配映射到现有的常规文件(即-f
  • 也可以映射到现有的目录(即-d ),

然后在内部重写请求index.php?=%{REQUEST_FILENAME}并使其成为当前处理的最后一个规则(即L标志)。

但是这个规则是无稽之谈。 因为请求无法同时映射到现有的常规文件现有的目录。 此外, REQUEST_FILENAME是一个绝对的文件系统path; 预先给它加上一个域名后缀会使其无效。

规则重写HTTP GET以使用PHP的查询string。

例如,它转向

 domain.com/page/1/ 

 domain.com?page=1