mod_rewrite - RewriteCond - 为什么需要比较语法?

时间:2017-01-06 16:15:23

标签: apache mod-rewrite

我有三个条件,但我找不到真正的区别,因为他们做同样的工作:

RewriteCond %{HTTPS} !=on

RewriteCond %{HTTPS} =off

RewriteCond %{HTTPS} off

此网站(http://httpd.apache.org/docs/current/mod/mod_rewrite.html)说:

  

语法:RewriteCond TestString CondPattern [flags]

CondPattern通常是perl兼容的正则表达式,但还有其他语法可用于对Teststring执行其他有用的测试:

如果条件本身有与正则表达式进行比较的任务,为什么还需要额外的比较语法?

2 个答案:

答案 0 :(得分:0)

您不需要任何比较语法。这些测试最简单的语法是:

RewriteCond %{HTTPS} on

或者:

RewriteCond %{HTTPS} off

如果你想使用=,你可以,它只是意味着它是一个直接的比较,而不是作为一个正则表达式,按照:

  

= CondPattern在词典上相等。将CondPattern视为普通字符串,并按字典顺序将其与TestString进行比较。如果是真的   TestString在字典上等于CondPattern(两个字符串   完全相同,是角色的特征)。如果CondPattern是"" (二   引号)这将TestString与空字符串进行比较。

比较运算符代表the various other tests that can be done with RewriteCond

这些选项是必需的,因为mod_rewrite是一个功能强大且灵活的系统。拥有这些用于比较的选项可以提高其实用性,并且比单独使用正则表达式开启更多可能它还提供了提高易读性的方法。例如,=/specific/URL.html^/specific/URL\.html$更容易阅读和替换。如果您检查我链接到的页面中的信息,您将看到直接比较只是众多选项中的一个,包括文件测试,小于/大于,小于或等于,大于或等于。所有这些都可以针对规则(首先处理)捕获,从条件,服务器变量,特殊变量(如HTTPS)甚至自定义映射中捕获。

除了正则表达式之外,拥有这些选项可以打开各种可能性,而单独使用正则表达式则无法实现。是的,当正则表达式可用时,直接比较可以被认为是不必要的,但是考虑到它所适用的系统的更大的上下文,非常值得包括小于,大于等等,正则表达式无法做到这一点。并且如上所述,在某些情况下也使得直接比较的语法更简单。您的HTTPS示例恰好是一个非常简单的案例,单独使用会使选项看起来不必要。

答案 1 :(得分:0)

他们没有做同样的工作。

直接RewriteCond假定条件表达式是正则表达式。

使用=!=的语法执行简单的字符串比较。

结果与示例中的相同,只是因为您使用的字符串没有正则表达式语法

对此感到困惑可能会导致错误和安全问题。

例如,攻击者可以通过仅发送带有wwwXexample.com的“主机”标头来利用以下条件:

RewriteCond %{HTTP_HOST} www.example.com [NC]

如果主机为www.example.com,则以下条件仅匹配

RewriteCond %{HTTP_HOST} =www.example.com [NC]

还有其他含义,尤其是性能:直接字符串比较比regexp匹配要快得多。

经验法则:如果要与模式匹配,请使用regexp。否则,请使用精确的字符串比较。