我们最近继承了一些代码,我正在查看其中一个站点的 .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
oroff
,则放置 (s)| in Pattern 会让它永远不匹配条件,对吧?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:
此规则用于将非 HTTP 连接转发到 HTTPS 连接。所以:
^on
用于检查“如果 HTTP 未激活”。^
表示否定匹配。%
符号的引用是指正RewriteCond
则表达式。在这种情况下,%1
指的是(s)
捕获组,因此%1
是s
当 HTTP 不活动时。编写方式
RewriteRule
有点过于复杂,我认为可能有一种更简单的方法来实现它。但是,它完成了它的设计目的。示例 2:
\s
匹配空白。所以,这个 RewriteRule 匹配/index.php
,即 . 后面的一个空格.php
。我认为第二个RewriteCond
使这条规则根本不起作用,除非网站软件的某些部分生成了不正确的 URL。示例 3:
.
简单地匹配任何字符串,并且是使用的index.php
替换。这里的匹配标准RewriteRule
不需要更具体,因为任何不存在的 URL 都会发送到index.php
.