Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ,这会定义 Nginx 如何去匹配其后的 pattern ,以及该 pattern 的最基本的属性(简单字符串或正则表达式)
location 的匹配符
1.等于匹配符:=
server { server_name website.com; location = /abcd { […] } } 匹配情况: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),Nginx 不认为这种情况是完全匹配 http://website.com/abcde # 不匹配,因为不是完全匹配
2.空匹配符
# 可以不写 location modifier ,Nginx 仍然能去匹配 pattern 。这种情况下,匹配那些以指定的 patern 开头的 URI,注意这里的 URI 只能是普通字符串,不能使用正则表达式。 server { server_name website.com; location /abcd { […] } } 匹配情况: http://website.com/abcd # 正好完全匹配 http://website.com/ABCD # 如果运行 Nginx server 的系统本身对大小写不敏感,比如 Windows ,那么也匹配 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 末尾存在反斜杠(trailing slash)也属于匹配范围内 http://website.com/abcde # 仍然匹配,因为 URI 是以 pattern 开头的
3.正则匹配符:~ 和 ~*
# 这个 location modifier 对大小写敏感,且 pattern 须是正则表达式 server { server_name website.com; location ~ ^/abcd$ { […] } } 匹配情况: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 不匹配,~ 对大小写是敏感的 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http://website.com/abcde # 不匹配正则表达式 ^/abcd$ # 注意:对于一些对大小写不敏感的系统,比如 Windows ,~ 和 ~* 都是不起作用的,这主要是操作系统的原因。
server { server_name website.com; location ~* ^/abcd$ { […] } } 匹配情况: http://website.com/abcd # 完全匹配 http://website.com/ABCD # 匹配,这就是它不区分大小写的特性 http://website.com/abcd?param1m2 # 忽略查询串参数(query string arguments),这里就是 /abcd 后面的 ?param1m2 http://website.com/abcd/ # 不匹配,因为末尾存在反斜杠(trailing slash),并不匹配正则表达式 ^/abcd$ http://website.com/abcde # 不匹配正则表达式 ^/abcd$
4. ^~
5. 内部访问符:@
匹配符优先级
location = /uri = 表示精确匹配,只有完全匹配上才能生效,若找到,停止搜索; location ^~ /uri ^~开头表示对URL路径进行前缀匹配,并且在正则匹配之前,若找到,停止搜索; location ~ pattern ~开头表示区分大小写的正则匹配,按配置文件顺序匹配; location ~* pattern ~*开头表示不区分大小写的正则匹配,按配置文件顺序匹配; location !~和!~* 分别为区分大小写不匹配及不区分大小写不匹配 的正则 location /uri 不带任何修饰符,表示前缀匹配,在正则匹配之后; location / 通用匹配,任何未匹配到其他location的请求都会匹配到,相当于default;
首先精确匹配 = ; 其次前缀匹配 ^~; 其次是按照配置文件中的正则匹配; 然后匹配不带任何修饰符的前缀匹配; 最后交给/通用匹配
文章来源:https://www.toymoban.com/news/detail-474424.html
案例
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] } location /documents/ { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration C ] } location ~ /documents/Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] } location ^~ /images/ { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] } location /images/ { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] } location /images/abc { # 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 # F与G的放置顺序是没有关系的 [ configuration G ] } location ~ /images/abc/ { # 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用 [ configuration H ] } location ~* /js/.*/\.js
文章来源地址https://www.toymoban.com/news/detail-474424.html
到了这里,关于Nginx Location 基本配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!