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

Nginx location匹配规则

作者头像
北国风光
发布于 2019-04-11 07:25:40
发布于 2019-04-11 07:25:40
2.2K00
代码可运行
举报
文章被收录于专栏:PHPer 进击PHPer 进击
运行总次数:0
代码可运行

1、语法

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

2、说明

从上面的语法出发,可以了解到 location 可以区分为三个部分,接下来一个一个的研究一下。

1) [=|~|~*|^~|@]
  • = : 表示精确匹配后面的url
  • ~ : 表示正则匹配,但是区分大小写
  • ~* : 正则匹配,不区分大小写
  • ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
  • @ : "@" 定义一个命名的 location,使用在内部定向时,例如 error_page

上面定义了几个不同的符号,表示不同的匹配规则,那么先后顺序呢?

  1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索;
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用 ^~ 前缀,搜索停止;
  3. 正则表达式,在配置文件中定义的顺序;
  4. 如果第 3 条规则产生匹配的话,结果被使用。否则,使用第 2 条规则的结果。
测试示例1:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location = /world {
    return 600;
}

location = /hello {
    return 600;
}

location ~ /hellowo {
    return 602;
}

location ^~ /hello {
    return 601;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 请求 localhost/world 返回600
- 请求 localhost/world2 localhost/test/world 返回其他
- 请求 localhost/hello  返回600
- 请求 localhost/hello/123 返回601
- 请求 localhost/hellow 返回601
- 请求 localhost/hellowo 返回601
- 请求 localhost/test/hellowo  返回602
- 请求 localhost/test/hello 返回其他

因此可以知道:

  • = 是精确完整匹配,且优先级最高;
  • 正则匹配时,如果 ~ 和 ^~ 同时匹配规则,则 ^~ 优先;
  • ^~ 这个规则不会匹配请求 url 中后面的路径,如上面的 /test/hello 没有匹配上
  • ^~ 不支持正则,和 = 相比,范围更广,hellowo 是可以被 ^~ 匹配,但是 = 不会匹配;
  • ~ 路径中只要包含就可以匹配,如上面的 /test/hellowo 返回了 602
测试示例2:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~ /hello {
  return 602;
}

location ~ /helloworld {
  return 601;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 请求 localhost/world/helloworld 返回 602
- 请求 localhost/helloworld 返回 602

调整上面的顺序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ~ /helloworld {
  return 601;
}

location ~ /hello {
  return 602;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- 请求 localhost/helloworld 返回601
- 请求 localhost/world/helloworld 返回601
- 请求 localhost/helloWorld 返回602

所以同时正则匹配时

  • 放在前面的优先匹配
  • 注意如果不区分大小写时,使用 ~*
  • 尽量将精确匹配的放在前面
测试示例3:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ^~ /hello/ {
  return 601;
}

location /hello/world {
  return 602;
}

这种场景中,存在一个没有符合的路由规则,那么实际的测试是怎样呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- http://localhost/hello/wor 返回601
- http://localhost/hello/world 返回602
- http://localhost/hello/world23 返回602
- http://localhost/hello/world/123 返回602

从上面的示例可以看出

  • 没有符合时,全匹配是优先 ^~ 的
2) [uri]

这里主要填的是需要匹配的 path 路径,根据前面的符号,这里可以填写精确到 path 路径,也可以填正则表达式,下面则主要针对正则进行说明

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
. : 匹配除换行符以外的任意字符
? : 重复0次或1+ : 重复1次或更多次
* : 重复0次或更多次
\d :匹配数字
^ : 匹配字符串的开始
$ : 匹配字符串的介绍
{n} : 重复n次
{n,} : 重复n次或更多次
[c] : 匹配单个字符c
[a-z] : 匹配a-z小写字母的任意一个
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。

路由转发

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
请求 path 匹配只是第一步,匹配完成之后,如何将请求转发给其它的 web 服务呢?

1、反向代理

通常可见的一种使用姿势就是使用 nginx 代理请求,转发到内部的其它 web 服务上

主要通过 prixy_pass 来实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ^~ /webs {
    proxy_pass http://127.0.0.1:8080/webs;
}

上面规则的含义是,将所有以 webs 开头的请求,转发到 8080 端口的 web 服务上。

上面是直接写死转发到一个 ip 上,如果是多个机器提供服务,可以这样配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 下面放在http的括号内,作为第一层
upstream test.online {
    server 47.106.81.116:8080 weight=1;
    server 47.106.81.117:8080 weight=1;
}

location ^~ /webs {
    proxy_pass http://test.online;
    proxy_redirect default;
}

2、Rewrite 命令

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。

rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用, 如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://blog.muzixizao.com/a/we/index.php?id=1&u=str

只对/a/we/index.php重写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
语法: rewrite regex replacement [flag];

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
location ^~ /hexo {
  root '/Users/yihui/GitHub/';
}

location ~ /hello {
  rewrite ^(/hello).*$ /hexo/public/index.html last;
  return 603;
}

将hello开头的,全部转发到/hexo/public/index.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-10-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx 路由转发配置笔记
Nginx 路由转发配置笔记 由于预算有限,只有一台服务器,想要玩的东西不少,所以这个台服务器上会提供多重服务,因此涉及到的nginx转发就必有重要了 由nginx做请求代理,提供多种服务 php搭建的网站 hexo创建的博客系统 spring-boot & tomcat搭建的后台 静态网页 本片配置笔记中,主要集中以下几个内容 location的匹配规则是怎样的 如何实现路由转发(反向代理) 如何修改请求的路径(如请求的是 a/index.html 改为 a/public/index.html) I.
一灰灰blog
2018/02/06
6.9K0
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详解Location匹配规则
本文我们来给大家详细介绍下Nginx中的核心配置文件中的Location匹配规则。   location会尝试根据用户请求中的URI来匹配上面的/uri表达式,如果可以匹配,就选择location{}块中的配置来处理用户请求。当然,匹配方式是多样的, 下面介绍location的匹配规则。 语法:
用户4919348
2020/05/21
3.6K0
Nginx系列教程(6)Nginx location 匹配规则详细解说
Nginx 的 location 实现了对请求的细分处理,有些 URI 返回静态内容,有些分发到后端服务器等,今天来彻底弄懂它的匹配规则
haikangweishi
2020/04/04
1.7K0
nginx location匹配规则
~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 =      #进行普通字符精确匹配 @     #”@” 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files
zhangdd
2018/08/01
7080
nginx location匹配方式
如果location为前缀匹配,url以/结尾,并且请求会被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass或者grpc_pass中的一个处理,如果请求结尾不带/,nginx会返回一个 301 重定向,如:
saosir
2019/08/13
1.2K0
nginx location匹配方式
[日常] nginx与location规则
========================================================================= 2018年3月28日 记录:
唯一Chat
2019/09/10
8330
Nginx location匹配规则
上述配置,默认访问/会重定向到/my-module, 然后直接返回/data/my-module/dist下的html等静态文件。
Ryan-Miao
2019/06/18
2K0
nginx配置 location及rewrite规则详解
1. location正则写法 语法规则: location [=|~|~*|^~] /uri/ { … } =    开头表示精确匹配 ^~  开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~   开头表示区分大小写的正则匹配 ~*  开头表示不区分大小写的正则匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹
用户1214487
2018/05/28
2.9K0
nginx location配置
编写本文时,使用的nginx版本为nginx/1.17.9和nginx/1.16.1
腾讯IVWEB团队
2020/09/22
3.7K1
【NGINX入门】4.Nginx location 匹配规则详细解说[+正则表达式]
Nginx 的 location 实现了对请求的细分处理,有些 URI 返回静态内容,有些分发到后端服务器等,今天来彻底弄懂它的匹配规则。
辉哥
2021/02/04
5.4K0
nginx location 配置详解
指令作用 匹配指定的请求uri(请求uri不包含查询字符串,如http://localhost:8080/test?id=10,请求uri是/test) 语法形式 location [ = | ~
西湖醋鱼
2020/12/30
1.7K0
nginx路径匹配_url路径匹配
一、前言 一般我们经常在访问网站时,通常会遇到输入某个页面的网址时,出现路由的转发,重定向等。可能访问的是一个网址,出来的时候就显示的是另外的地址。 这种情况下,通常属于nginx的页面跳转。
全栈程序员站长
2022/11/19
6.6K0
nginx路径匹配_url路径匹配
Nginx 之 Location基础理解及实战
语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~ 开头表示区分大小写的正则匹配 ~*  开头表示不区分大小写的正则匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 . / 通用匹配,任何请求都会匹配到。
星哥玩云
2022/06/30
2490
Nginx的location配置规则梳理
Nginx几乎是当下绝大多数公司在用的web应用服务,熟悉Nginx的配置,对于我们日常的运维工作是至关重要的,下面就Nginx的location配置进行梳理: 1)location匹配的是nginx
洗尽了浮华
2018/01/23
2.1K0
Nginx学习之location匹配规则
介绍 location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。 location 的匹配符 ~ 波浪线表示执行一个正则匹配,区分大小写 ~* 表示执行一个正则匹配,不区分大小写 ^~ 表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录 = 进行普通字符精确匹配 @ 定义一个命名的 location,使用在内部定向时,例如 error_
小柒2012
2018/04/13
7970
详解Nginx location 匹配规则
本篇文章主要介绍了Nginx location 匹配规则,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
习惯说一说
2019/05/10
1.9K0
Nginx中location、rewrite使用方法
矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”。我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家平时习惯的按“先匹配正则,再匹配普通”的实践经验。这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配。
星哥玩云
2022/07/28
1.2K0
Nginx中location、rewrite使用方法
nginx中的location & root & alias & rewrite
注意: alias只能用于location中(使用alias,目录名后面一定要加“/”),而root可以用在http、server和location中。
阿dai学长
2019/04/03
2.9K0
Nginx Location和Rewrite深入剖析
Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
星哥玩云
2022/07/26
7650
相关推荐
Nginx 路由转发配置笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验