这些重写行是什么意思?

这些重写行是什么意思?

可能重复:
您想了解有关 Mod_Rewrite 规则的所有信息但又不敢问吗?

下面几行是什么意思?抱歉,我是正则表达式的新手。

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.。我说的对吗?

  2. 什么意思%1/%

  3. 重写规则 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}并将其作为当前处理中的最后一条规则(即大号旗帜)。

但这条规则是无稽之谈。因为请求不能同时映射到现有的常规文件同时删除现有目录。此外,请求文件名是绝对文件系统路径;在其前面添加诸如域后缀之类的内容将使其无效。

答案2

规则改写了HTTP 获取使用 PHP 的查询字符串。

例如,

domain.com/page/1/ 

进入

domain.com?page=1

相关内容