我们最近继承了一些代码,我正在审查其中一个网站的 .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 提供的特殊变量之一,其计算结果为 或on
。off
在之前的规则中,我看到了RewriteCond %{HTTPS} =on
哪个更有意义,并且与文档中显示的内容一致这里所以在上面的例子中,我有以下几个问题:
- %{HTTPS}s 中结尾的“s”代表什么
- 为什么该模式使用 ^on 而不是 =on。这有效吗?
- 我知道括号内的任何内容都可以用 %1 反向引用,但它在这里的位置对我来说真的没有意义。如果 %{HTTPS} 的计算结果为
on
或off
,那么在 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。
\s
index.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 中,模式.
在正则表达式中表示“任何字符”。
- 这条规则是不是说“如果满足上述条件,则用 index.php 替换任意字符”?这条规则的作用是什么?
答案1
请忽略这个答案,它在很多方面都是错误的。
示例 1:
此规则用于将非 HTTP 连接转发到 HTTPS 连接。因此:
- 结尾的 s 代表 SSL。
^on
用于检查“HTTP 是否未处于活动状态”。^
表示负匹配。- 带 符号的引用
%
指的是RewriteCond
正则表达式。在本例中,%1
指的是(s)
捕获组,因此当 HTTP 未处于活动状态时%1
是。s
写的方式RewriteRule
有点过于复杂,我认为应该有更简单的方法来实现它。不过,它完成了它设计的任务。
示例 2:
- 匹配
\s
空格。因此,此 RewriteRule 匹配/index.php
,即 后面的空格.php
。我认为第二个RewriteCond
使得此规则根本不起作用,除非网站软件的某些部分生成了错误的 URL。
示例 3:
- 它的意思是“如果满足上述条件,则用 index.php 替换 URL 中的任何字符串”。
.
仅匹配任何字符串,并且index.php
是使用的替换。此处的匹配条件RewriteRule
不需要更具体,因为任何不存在的 URL 都会发送到index.php
。