一些mod_rewrite的语法澄清

我们最近inheritance了一些代码,并且正在审查其中一个站点的.htaccess文件。 我知道大部分重写规则集的最终结果是什么,我只是不确定一些语法。 背景信息:使用Apache 2.4的CentOS 7,运行Concrete5 CMS。

例1:

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

据我所知,%{HTTPS}是mod_rewrite提供的特殊variables之一,可以onoff 。 在之前的规则中,我看到了RewriteCond %{HTTPS} =on这更符合文档中显示的内容。 所以在上面的例子中,我有以下问题:

  1. %{HTTPS}中的结尾“s”是什么?
  2. 为什么模式使用^ on而不是= on。 这有效吗?
  3. 我明白,括号中的任何内容都可以用%1来引用,但这里的放置对我来说并不合适。 如果%{HTTPS}计算为onoff ,则放置(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. 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中,模式是. 这在正则expression意思是“任何性格”。

  1. 这条规则说“如果满足上述条件,用index.phpreplace任何字符”? 这条规则是干什么的?

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

例1:

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

  1. 最后的s是用于SSL。
  2. ^on用于检查“HTTP是否不活动”。 ^意味着负面的匹配。
  3. 带有%符号的引用指的是RewriteCond正则expression式。 在这种情况下, %1指的是捕获组,因此当HTTP不活动时, %1s

这个RewriteRule写的方式有点RewriteRule复杂了,我想可能有一个更简单的方法来实现它。 但是,它完成了它的devise。

例2:

  1. \s匹配空格。 所以,这个RewriteRule和/index.php匹配,也就是.php后面的空格。 我认为第二个RewriteCond使这个规则根本不起作用,除非网站软件的某些部分产生不正确的URL。

例3:

  1. 这意味着,“如果符合上述条件,请使用index.phpreplaceURL中的任何string”。 的. 简单地匹配任何string,并且index.php是使用的replace。 这个RewriteRule中的匹配条件不需要更具体,因为任何不存在的URL被发送到index.php