下面几行是什么意思?抱歉,我是正则表达式的新手。
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.
。我说的对吗?什么意思
%1/%
?重写规则 index.php?=%{REQUEST_FILENAME}
如果三个RewriteCond
都没问题,它就会执行该RewriteRule
行。这个规则是什么意思?
答案1
这些行不是正则表达式,但是mod_rewrite 指令。
要了解此规则集的作用,您需要知道规则集的内部处理方式以及指令的含义。对于后者,您应该查看手动的。
执行此操作后,您应该会看到RewriteRule
可能不是预期的结果。因为第一个参数(即index.php?=%{REQUEST_FILENAME}
)被解释为正则表达式模式,而第二个参数被解释为替换(即[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]
该规则集可以解释如下:
如果
- 该模式
^
与给定的请求 URI 路径匹配- 和
^www\.(.*)$
匹配的值HTTP_主机- 和
%1
前一个成功模式匹配的第一个子模式(即)的匹配与的值RewriteCond
连接起来/
请求文件名可以映射到现有的常规文件(即-f
)- 和也可以映射到现有目录(即
-d
),然后在内部重写请求,
index.php?=%{REQUEST_FILENAME}
并将其作为当前处理中的最后一条规则(即大号旗帜)。
但这条规则是无稽之谈。因为请求不能同时映射到现有的常规文件和同时删除现有目录。此外,请求文件名是绝对文件系统路径;在其前面添加诸如域后缀之类的内容将使其无效。