一些 mod_rewrite 语法说明

一些 mod_rewrite 语法说明

我们最近继承了一些代码,我正在审查其中一个网站的 .htaccess 文件。我了解大多数重写规则集的最终结果,只是不确定一些语法。背景信息:CentOS 7 带有 Apache 2.4,运行 Concrete5 CMS。

示例 1:

RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

我理解 %{HTTPS} 是 mod_rewrite 提供的特殊变量之一,其计算结果为 或onoff在之前的规则中,我看到了RewriteCond %{HTTPS} =on哪个更有意义,并且与文档中显示的内容一致这里所以在上面的例子中,我有以下几个问题:

  1. %{HTTPS}s 中结尾的“s”代表什么
  2. 为什么该模式使用 ^on 而不是 =on。这有效吗?
  3. 我知道括号内的任何内容都可以用 %1 反向引用,但它在这里的位置对我来说真的没有意义。如果 %{HTTPS} 的计算结果为onoff,那么在 Pattern 中放置 (s)| 将使其永远无法满足条件,对吗?PIPE 是干什么用的?

示例 2:

#redirect calls to index.php without get parameters to non-www
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{THE_REQUEST} /index\.php\s [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

我不太理解第二个RewriteCond。

  1. \sindex.php 末尾的内容是什么?

示例 3:

最后,我们有

#Standard C5 pretty urls
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME}/index.html !-f 
RewriteCond %{REQUEST_FILENAME}/index.php !-f 
RewriteRule . index.php [L]

在 RewriteRule 中,模式.在正则表达式中表示“任何字符”。

  1. 这条规则是不是说“如果满足上述条件,则用 index.php 替换任意字符”?这条规则的作用是什么?

答案1

请忽略这个答案,它在很多方面都是错误的。

示例 1:

此规则用于将非 HTTP 连接转发到 HTTPS 连接。因此:

  1. 结尾的 s 代表 SSL。
  2. ^on用于检查“HTTP 是否未处于活动状态”。^表示负匹配。
  3. 带 符号的引用%指的是RewriteCond正则表达式。在本例中,%1指的是(s)捕获组,因此当 HTTP 未处于活动状态时%1是。s

写的方式RewriteRule有点过于复杂,我认为应该有更简单的方法来实现它。不过,它完成了它设计的任务。

示例 2:

  1. 匹配\s空格。因此,此 RewriteRule 匹配/index.php,即 后面的空格.php。我认为第二个RewriteCond使得此规则根本不起作用,除非网站软件的某些部分生成了错误的 URL。

示例 3:

  1. 它的意思是“如果满足上述条件,则用 index.php 替换 URL 中的任何字符串”。.仅匹配任何字符串,并且index.php是使用的替换。此处的匹配条件RewriteRule不需要更具体,因为任何不存在的 URL 都会发送到index.php

相关内容