Tanto quanto eu li / entendi, ambos =
e ^~
são modificadores de prefixo de string normais ( nenhum deles é modificador 'reg-exp'). Ambos permitem apenas correspondências exatas (caso contrário, é considerado não correspondente). E se a correspondência exata for encontrada, ambos param o processo de correspondência e a 'localização' acompanhada é exibida imediatamente.
Então qual é a diferença entre esses 2 modificadores?
=
é correspondência exata, e não correspondência de prefixo^~
é uma correspondência de prefixo "priorizada" que tem prioridade sobre as correspondências de expressão regular. Em outras palavras, é o mesmo que o local de prefixo padrão,location /something
com a única diferença de que, se corresponder ao URI, os locais de expressão regular não serão pesquisados.=
permite apenas correspondência exata,location = /foo
é considerado uma correspondência apenas para URI/foo
(ou/foo?some=arg
) e nenhum outro, por exemplo,foobar
não corresponderá^~
permite correspondência de prefixo, por exemplo,location ^~ /foo
correspondências/foo
e/foobar
e/fooanything
Conforme descrito acima, apenas
=
a correspondência exata tem apenas uma base de URI para correspondência e tem prioridade sobre outros tipos de correspondência.O
^~
tem correspondências possíveis ilimitadas. Essa é a principal diferença entre os dois.A correspondência exata (
=
) é o tipo de correspondência com maior eficiência de desempenho . Use-o sempre que possível:É preferível a
location ~ ^/foo/bar$ { return 301 /foo; }
.Se você deseja negar o acesso a diretórios específicos, a correspondência de prefixo priorizada também faz muito sentido, pois não envolve avaliação de expressão regular:
Irá negar qualquer coisa dentro
/foo/
do diretório, não apenas/foo/
URI.Para recapitular:
ATUALIZAR
Obrigado a @danila-vershinin apontando isso, mas
=
na verdade não defina um prefixo, mas apenas uma correspondência exata. Veja a resposta dele para uma resposta mais completa/correta.Resposta original abaixo
Se você tem um único local, está certo, não importa se você usa
=
ou^~
. A diferença ocorre quando você tem muitos locais, e os diferentes modificadores afetam a ordem de cada um no final.Da documentação :
Basicamente, ter um
= /test
é útil se você deseja corresponder ao caminho exato/test
e, nesse caso, todo o processamento posterior (expressões regulares) é omitido.Se nenhuma correspondência exata for encontrada, ambos
=
e^~
serão correspondências de prefixo , e a correspondência mais longa de todos esses locais será selecionada. Se tiver o modificador,^~
ele será usado imediatamente, caso contrário, as expressões regulares serão verificadas primeiro.No exemplo concreto, se você tiver um local
= /test
e solicitar o caminho/test/bla.html
, primeiro todas as outras expressões regulares serão verificadas e somente se nenhuma corresponder será= /test
usada. Se, em vez disso, você tiver^~ /test
e solicitar/test/bla.html
, isso será usado, mesmo que haja, por exemplo, expressões regulares correspondentes*.html
.PS
Observe que apenas o prefixo correspondente mais longo é importante aqui. Se você tiver dois locais:
= /test
e^~ /test/bla
e pedindo/test/bla/x.html
, então o^~ /test/bla
é o usado e, como tem^~
, nenhum regex será verificado. Se, em vez disso, os locais forem^~ /test
e= /test/bla
, o=
é o mais longo, então o regex será verificado neste caso (e o^~ /test
é completamente ignorado).