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

Apache mod_rewrite-RewriteCond-为什么需要比较语法?,apache,mod-rewrite,Apache,Mod Rewrite,我这里有三个条件,但我找不到真正的区别,因为它们做相同的工作: RewriteCond %{HTTPS} !=on RewriteCond %{HTTPS} =off RewriteCond %{HTTPS} off 这个网站()说: 语法:RewriteCond TestString CondPattern[标志] CondPattern通常是一个与perl兼容的正则表达式,但还有其他语法可用于对Teststring执行其他有用的测试: 如果条件本身有与正则表达式进行比较的任务,为什么我

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

RewriteCond %{HTTPS} !=on

RewriteCond %{HTTPS} =off

RewriteCond %{HTTPS} off
这个网站()说:

语法:
RewriteCond TestString CondPattern[标志]

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


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

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

RewriteCond %{HTTPS} on
或:

如果您希望使用
=
,您可以,这只是意味着它是一个直接的比较,而不是作为正则表达式处理,如下所示:

=按字典顺序相等。将CondPattern视为普通字符串,并按字典顺序将其与TestString进行比较。如果正确 TestString在词典编纂上等于CondPattern(两个字符串 完全平等,一个字符对一个字符)。如果CondPattern为“”(两个 引号)将TestString与空字符串进行比较

比较运算符使用它们自己的方法进行比较

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


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

它们的作用不同

Straight
RewriteCond
假定条件表达式是正则表达式

包含
=
的语法=执行简单的字符串比较

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

对此的混淆可能会导致错误和安全问题

例如,攻击者只需发送带有
wwwXexample.com
的“主机”头,即可利用以下情况进行攻击:

RewriteCond %{HTTP_HOST} www.example.com [NC]
然而,如果主机是
www.example.com
,则以下条件将仅匹配

RewriteCond %{HTTP_HOST} =www.example.com [NC]
还有其他影响,最显著的是性能:直接字符串比较比regexp匹配快得多


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

这就是我的问题所在。如果语句本身将测试字符串与condpattern进行比较/匹配,那么为什么我需要额外的符号进行比较,如“等号”。非常感谢您的解释。你认为对我来说,使用等号更好吗?是否存在性能差异?一般来说,什么更好?我想说的是性能上的差异,使用“=”语法更好,因为这是一个直接的比较,不需要正则表达式引擎。但是正则表达式经过了很好的优化,我的偏好是不使用它来提高易读性。我们可能在谈论毫秒差。不过我不是专家。这是一个很好的问题,也许值得开始一个新的问题。我看你是个新手。如果你能用我答案左上角的勾号,这表明你接受了它,并给了我一些声誉,就像我投票支持你的问题时一样。谢谢,我对堆栈溢出还不熟悉。:-)我找到了虱子。因此,最后通过您的上一次通信,我不确定您个人是否更喜欢使用正则表达式引擎,还是直接与附加等号进行比较,而不管性能如何?取决于具体情况。对于这种特殊情况,我更喜欢正则表达式(不带=),因为它在通读规则时非常直观,而且性能差异可以忽略不计。所以我总是使用
RewriteCond%{HTTPS}off
,即使这是性能最差的一个。
RewriteCond %{HTTP_HOST} =www.example.com [NC]