Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nginx入门详解(七)- 匹配规则

nginx入门详解(七)- 匹配规则

作者头像
用户8639654
修改于 2021-08-19 10:05:31
修改于 2021-08-19 10:05:31
1.6K00
代码可运行
举报
文章被收录于专栏:云计算运维云计算运维
运行总次数:0
代码可运行

Location 基础知识:

概念:

我们可以通过配置Location指令块,来决定客户端发过来的请求URI如何处理。

语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Syntax:	location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:Context:	server, location

location 配置可以有两种配置方法,可以在server指令块和location指令块配置。

1、修饰符 + uri(资源路径)

2、@ + name

修饰符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
=  :精确匹配(必须全部相等)
 ~  :大小写敏感(正则表达式)
 ~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,
 但是不会进行大小转换,请求的大小写对应的文件必须存在。
 ^~ :只需匹配uri部分
 @  :内部服务跳转

Location 配置实例:

1、=,精确匹配,一般是匹配某个具体文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = /index.html {
     [ configuration ] 
 }
 # 则匹配到`http://www.lutixia.com/index.html`这种请求。 

还有这种写法,精准匹配/,可以加快首页访问速度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = / {
     root html;
     index index.html;
 }

有一点需要注意,如果想变更根目录,比如把根目录设置为/usr/local/nginx/html/lutixia,那么直接这么写可能会出问题,假如原根目录(html)没有index.html文件,会报404。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = / {
     root /usr/local/nginx/html/lutixia;
     index index.html;
 }
 如果写成这样的话,即使lutixia目录下有index.html,也会直接报错,
 报找不到文件,可是里面明明有文件呀。

解释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
当我们访问www.lutixia.com/时,确实匹配到了这个location,
但是这个时候请求的前缀会变成/index.html,所以已经不再匹配这个localtion规则。
因为找不到其他匹配规则,
所以默认会去匹配根目录下(html)的文件,但是这时根目录下的index.html不存在,
所以报错404

同样的,如果lutixia目录里面有其他的文件,我们通过这个localtion规则也是无法访问的, 因为它只匹配/,其他的url都不再是它匹配。

那么怎么解决这个问题呢?可以在加一个location。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = / {
                root html/lutixia;
                index index.html;
        }
        location  / {
                root html/lutixia;
                index index.html;
        }

通过加这个location,凡是没有匹配到的资源会到/目录下去找
,根的目录重新定义了,所以可以实现这个需求。

2、~,大小写敏感(正则表达式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~ /LUTIXIA/ {
         [ configuration ] 
    }
    #请求示例
    #http://www.lutixia.com/LUTIXIA/  [成功]
    #http://www.lutixia.com/lutixia/  [失败]

3、~*,大小写忽略(正则表达式)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~* /LUTIXIA/ {
           [ configuration ] 
}
# 则会忽略 uri 部分的大小写
#http://www.lutixia.com/LUTIXIA/  [成功] 可以成功匹配,但是目录中要LUTIXIA文件
#http://www.lutixia.com/lutixia/  [成功] 可以成功匹配,但是目录中要lutixia文件

4、^~,只匹配以 uri 开头,匹配成功以后,会停止搜索后面的正则表达式匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ^~ /img/ {
       [ configuration ] 
}
#以 /img/ 开头的请求,都会匹配上
#http://www.lutixia.com/img/lutixia.jpg   [成功]
#http://www.lutixia.com/img/lutixia.png [成功]

5、匹配以gif、jpg、jpeg结尾的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~* \.(gif|jpg|jpeg)$ {
    [ configuration ] 
}
    #http://www.lutixia.com/img/lutixia.jpg [成功] 

如果配置了4,那么所有请求 /img/ 下的图片会被上面4处理,因为 ^~ 指令匹配到了,则不检查正则表达式。

5、@,nginx内部跳转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location /data/ {
    error_page 404 @img_err;
}

location @img_err {
   [ configuration ] 
}
#以 /data/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上。

同时有多个location时,优先级如下:

完整范例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
这里有一简短的localtion配置:

        location  /img/ {
                echo " /img/";
        }
        location ~ /img/ {
                echo "~ /img/";
        }
        location ~* /img/ {
                echo "~* /img/";
        }
        location ^~ /img/ {
                echo "^~ /img/";
        }
        location = /img/ { 
                echo "=  /img/";
        }

如果客户端的请求是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://192.168.0.116/img/

那么按照匹配规则顺序应该是这样的:

第一步:取出uri:/img/

第二步:去匹配localtion规则,查找有没有 = /img/的规则,有则停止匹配。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@www ~]# curl 192.168.0.116/img/
=  /img/

第三步:将location = /img/规则注释,继续查找有没有 ^~ /img/的规则,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@www ~]# curl 192.168.0.116/img/
^~ /img/

第四步:将 location ^~ /img/注释,这是它会去查找有没有正则匹配规则。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location  /img/ {
                echo " /img/";
        }
        location ~ /img/ {
                echo "~ /img/";
        }
        location ~* /img/ {
                echo "~* /img/";
        }
#        location ^~ /img/ {
#               echo "^~ /img/";
#        }
#       location = /img/ {
#               echo "=  /img/";
#       }

其中,第一个和的第二个规则都是正则,这时会按照至上而下的顺序匹配。

[root@www ~]# curl 192.168.0.116/img/
~ /img/

第五步:其他的都注释后,因为优先匹配规则都没有找到,最后匹配到 /img/规则。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@www ~]# curl 192.168.0.116/img/
 /img/

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
nginx之location指令
localtion可以由前缀字符串或正则表达式定义。正则表达式使用前面的“〜*”修饰符(不区分大小写匹配)或“〜”修饰符(用于区分大小写匹配)指定。要找到匹配给定请求的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。默认情况, nginx先检查前缀字符串,然后检查正则表达式,如果前缀字符串匹配到了,并且前缀字符串有这个“^~” 要求,就不配正则了;如果没有这个“^~” ,即使前缀匹配到了,也要去匹配正则表则,如果正则表达式匹配到了,就是用正则表达式的,没有就是用前缀字符串匹配到的路径
山行AI
2019/08/05
1.5K0
决定努力学Nginx/OpenResty详解,location路由规则配置详解了
location路由匹配发生在HTTP请求处理的find-config配置查找阶段,主要功能是:根据请求的URI地址匹配location路由表达式,如果匹配成功,就执行location后面的上下文配置块。
愿天堂没有BUG
2022/10/28
1.2K0
决定努力学Nginx/OpenResty详解,location路由规则配置详解了
Nginx的location配置规则梳理
Nginx几乎是当下绝大多数公司在用的web应用服务,熟悉Nginx的配置,对于我们日常的运维工作是至关重要的,下面就Nginx的location配置进行梳理: 1)location匹配的是nginx
洗尽了浮华
2018/01/23
2.1K0
Nginx Location 匹配规则
Nginx 的 location 用于匹配 URI 不同路径的请求,实现对请求的细分处理。例如当客户端请求 https://www.nginx-test.com/index.html 时,Nginx 使用本地的静态文件响应,而当客户端请求相同地址的 https://www.nginx-test.com/api 时,Nginx 将请求转发到后端服务器。
Se7en258
2021/07/01
1.5K0
Nginx server_name和location匹配规则
⑥如果所有Host头匹配失败,那么将会转向listen指令标记的default server;
用户4046016
2021/04/19
8.1K0
Nginx详解Location匹配规则
本文我们来给大家详细介绍下Nginx中的核心配置文件中的Location匹配规则。   location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。当然,匹配方式是多样的, 下面介绍location的匹配规则。 语法:
用户4919348
2020/05/21
3.6K0
Nginx正则表达式之匹配操作符详解 原
nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能。例如:防止rewrite、盗链、对静态资源设置缓存以及浏览器限制等等。由于nginx配置中有if指令,但是没有对应else指令,所以判断要分为匹配和不匹配。
拓荒者
2019/03/11
1.4K0
详解Nginx location 匹配规则
本篇文章主要介绍了Nginx location 匹配规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
习惯说一说
2019/05/10
2K0
实用篇-无处不在的Location
location配置是nginx模块化配置中最出色的一个设计,几乎所有nginx的业务场景都要通过书写多个location配置来顺应业务需要。语法配置和执行规则都相对比较简单,完全可以掌握在脑海之中。
后端技术探索
2018/08/10
5280
Nginx之location详解
3、一旦配置请求location映射到了指定的位置,那么下面全部的文件夹和文件都可以映射到,不需要在配置对其的映射,比如,但是如果使用其中的文件名重新映射了地址,那么这个路径将不能使用
爱撒谎的男孩
2019/12/31
9020
Nginx葵花宝典—草根站长配置Nginx运维百科全书
前段时间把网站迁移到腾讯云,之前是lamp,现在改为lnmp,自以为nginx功底还可以,开发这么多年,平常环境都有配置。但是,但是,最近读站点做SEO优化,发现nginx很多地方不会配。比如:
周陆军博客
2023/06/06
9070
nginx的location、rewrite玩法详解
顺序 no优先级: (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
sunsky
2020/08/20
1.2K0
nginx location if 的匹配规则
~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,不是正则匹配。如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =      #进行普通字符精确匹配 @     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
拓荒者
2019/03/11
13K0
Nginx - location中的匹配规则和动态Proxy
https://nginx.org/en/docs/http/ngx_http_core_module.html#location
小小工匠
2024/05/26
1.5K0
Nginx - location中的匹配规则和动态Proxy
建议收藏 | 彻底搞懂 Nginx 的五大应用场景
导读:Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
码农架构
2021/07/09
1K0
建议收藏 | 彻底搞懂 Nginx 的五大应用场景
nginx路径匹配_url路径匹配
一、前言 一般我们经常在访问网站时,通常会遇到输入某个页面的网址时,出现路由的转发,重定向等。可能访问的是一个网址,出来的时候就显示的是另外的地址。 这种情况下,通常属于nginx的页面跳转。
全栈程序员站长
2022/11/19
6.6K0
nginx路径匹配_url路径匹配
Nginx实例与localtion匹配规则
〇、官方手册 一、反向代理 docker run --name nginx -d -p 80:80 -v /nginx/html:/usr/share/nginx/html -v /nginx/nginx.conf:/etc/nginx/nginx.conf nginx 下面为容器的端口!!!!!! # 运行用户 #user nobody; # 启动进程,通常设置成和cpu数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.lo
wuweixiang
2019/03/12
9210
【NGINX入门】6.Nginx的rewrite规则详解
nginx Rewrite规则可以让网站的url中达到某种状态时定向/跳转到某个规则,本文具体介绍这些规则和说明。
辉哥
2021/02/04
4.5K0
【Nginx06】Nginx学习:HTTP核心模块(三)Location
Location 是整个 HTTP 模块中非常重要的一个子模块,它是为某个请求URI(路径)建立配置。这个模块又是属于 Server 模块的子模块,同时它还可以嵌套在另一个 Location 模块下面,因此,它的作用范围是 server 和 location 。其实,说白了,也就是我们可以为指定的一些路径去做一些额外的配置。
硬核项目经理
2023/08/09
1K0
【Nginx06】Nginx学习:HTTP核心模块(三)Location
Nginx参数详解+Rewrite规则
每个请求按时间顺序逐一分配到后端不同的服务器,如果后端某台服务器down掉,自动剔除,待恢复自动添加上。
用户8449980
2021/07/12
1.6K0
相关推荐
nginx之location指令
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档