我们最近继承了一些代码,我正在查看其中一个站点的 .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 替换任何字符”?这条规则在做什么?