据我所读/理解, 和=
都是^~
普通的字符串前缀修饰符( 'reg-exp'修饰符都不是)。两者都只允许完全匹配(否则它被认为是不匹配)。如果找到完全匹配,则两者都会停止进一步的匹配过程,并立即提供伴随的“位置”。
那么这2个修饰符有什么区别呢?
据我所读/理解, 和=
都是^~
普通的字符串前缀修饰符( 'reg-exp'修饰符都不是)。两者都只允许完全匹配(否则它被认为是不匹配)。如果找到完全匹配,则两者都会停止进一步的匹配过程,并立即提供伴随的“位置”。
那么这2个修饰符有什么区别呢?
=
是精确匹配,根本不是前缀匹配^~
是优先于正则表达式匹配的“优先”前缀匹配。换句话说,它与标准前缀位置一样,location /something
唯一的区别是如果它与 URI 匹配,则不会搜索正则表达式位置。=
只允许精确匹配,location = /foo
被认为只匹配 URI/foo
(或/foo?some=arg
),没有其他匹配,例如foobar
不会匹配它^~
允许前缀匹配,例如location ^~ /foo
匹配/foo
和/foobar
和/fooanything
如上所述,only
=
是精确匹配,只有一个 URI 基础可以匹配,并且优先于其他匹配类型。有
^~
无限可能的匹配。这是两者之间的关键区别。精确匹配 (
=
) 是性能效率最高的匹配类型。尽可能使用它:优先于
location ~ ^/foo/bar$ { return 301 /foo; }
.如果您想拒绝对特定目录的访问,优先前缀匹配也很有意义,因为它不涉及正则表达式评估:
将拒绝
/foo/
目录中的任何内容,而不仅仅是/foo/
URI。回顾一下:
更新
感谢@danila-vershinin 指出这一点,但
=
实际上并没有定义前缀,而只是精确匹配。查看他的答案以获得更完整/正确的答案。原回答如下
=
如果您只有一个位置,那么您是对的,无论您使用or都没有关系^~
。当您有多个位置时就会出现差异,并且不同的修饰符会影响最后匹配的顺序。从文档中:
= /test
基本上,如果您想匹配确切的路径/test
并且在这种情况下所有进一步的处理(正则表达式)都将被省略,那么使用 an是很有用的。如果没有找到精确匹配,则
=
和^~
都是前缀匹配,并从所有这些位置中选择最长的匹配。如果有修饰符,^~
它将被立即使用,否则将首先检查正则表达式。在具体示例中,如果您有一个位置
= /test
并要求路径/test/bla.html
,首先将检查所有其他正则表达式,只有在没有匹配项时才会= /test
使用。相反,如果你有^~ /test
并要求/test/bla.html
,这将被使用,即使有例如正则表达式匹配*.html
。聚苯乙烯
请注意,这里只有最长的匹配前缀很重要。如果你有两个位置:
= /test
and 和^~ /test/bla
asking for/test/bla/x.html
,那么 the^~ /test/bla
就是用过的那个,因为它有^~
,所以不会检查正则表达式。相反,如果位置是^~ /test
and= /test/bla
,则 the=
是最长的一个,因此在这种情况下将检查正则表达式(并且^~ /test
完全忽略 the )。