可能重复:
一切你想知道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}请求文件名
( ^www\.(.*)$ )中的$是什么意思。 所有客户端请求的URL都是以www.开头的www. 。 我对吗?
%1/%的含义是什么?
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