最近遇到一个问题,精心准备的url始终跳不到指定的规则上,故深入了解了一下location的匹配规则及顺序,整理如下:
匹配规则:
前缀字符串
=:精确匹配
^~: 匹配上后则不再进行正则表达式匹配
正则表达式:
~:大小写敏感的正则匹配
~*:忽略大小写的正则匹配
@:用于内部跳转的命名location
匹配顺序:
遍历匹配全部的前缀字符串location
如果匹配上=和^~,就使用匹配的字符串,不再继续匹配。
如果没有匹配上,会记住最长匹配的前缀字符串location(无视正则匹配)
然后按照nginx.conf中的顺序依次匹配正则表达式location,匹配上就使用。(优先级正则大于前缀)
如果没有匹配上,就使用最长匹配的前缀字符串location。
看个例子
location ^~ keke/ {return 200 '~/keke/';}location ~ /keke/(\w+)$ {return 200 '/keke/zhengze';}location /keke/keke/ {return 200 '/keke/keke/';}location = /keke/ {return 200 '=/keke/';}location /keke/haha {return 200 '/keke/haha';}
我访问以下内容会返回什么呢?
curl http://localhost/keke/
curl http://localhost/keke/haha
curl http://localhost/keke/keke/
curl http://localhost/keke/keke/keke
curl http://localhost/keke/keke2
第一个返回的是=/keke/ ,=优先级更高
第二个返回的是/keke/zhengze,正则优先级高
第三个返回的是/keke/keke/
第四个返回的是/keke/keke/
第五个返回的是~/keke/ ,最长匹配无视正则匹配
部分内容来自网络,如有侵权请联系作责删除。
文章转载自爱可可的人生记录仪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




