nginx中的正则表达式及location和rewrite

目录

常用的Nginx 正则表达式

location和rewrite的区别

location

location 大致可以分为三类

location 常用的匹配规则

location 优先级

location 示例说明

location优先级的总结

rewrite

rewrite的功能

rewrite实现跳转的条件

rewrite的执行顺序

rewrite的语法格式

rewrite的示例


常用的Nginx 正则表达式

  • ^ :匹配输入字符串的起始位置
  • $ :匹配输入字符串的结束位置
  • * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
  • + :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
  • ? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
  • . :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
  • \ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
  • \d :匹配纯数字[0-9]   \s :空白符    \w :任意单词字符包括下划线[A-Za-z0-9_]
  • {n} :重复 n 次
  • {n,} :重复 n 次或更多次
  • {n,m} :重复 n 到 m 次
  • [] :定义匹配的字符范围
  • [c] :匹配单个字符 c
  • [a-z] :匹配 a-z 小写字母的任意一个
  • [a-zA-Z0-9] :匹配所有大小写字母或数字
  • () :表达式的开始和结束位置
  • | :或运算符

location和rewrite的区别

从功能看 rewrite 和 location 似乎有点像,都能实现跳转,主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器。

  • rewrite 对访问的域名或者域名内的URL路径地址重写,重定向请求
  • location 对访问的路径做访问控制或者代理转发

location

location 大致可以分为三类

  • 精准匹配:location = / {...}
  • 一般匹配:location / {...} 
  • 正则匹配:location ~ / {...}

location 常用的匹配规则

  • = :进行普通字符精确匹配,也就是完全匹配。
  • ^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 正则匹配location。
  • ~ :区分大小写的匹配。
  • ~* :不区分大小写的匹配。
  • !~ :区分大小写的匹配取非。
  • !~* :不区分大小写的匹配取非。

location 优先级

  1. 首先精确匹配 =
  2. 其次前缀匹配 ^~
  3. 其次是按文件中顺序的正则匹配 ~或~*
  4. 然后匹配不带任何修饰符的一般前缀匹配
  5. 最后是交给 / 通用匹配

location 示例说明

(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

(2)location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但后面前缀路径会和最长字符串优先匹配(最长匹配)

(3)location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

(4)location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的前缀路径没有匹配到时,才会采用这一条

(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

(6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则

(7)location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

(8)location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

(9)location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

location优先级的总结

(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分前缀路径) > (location /)

  • 在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location,如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location
  • 前缀匹配看长度,最长的优先匹配
  • 正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求
  • 只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

rewrite

rewrite的功能

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

rewrite实现跳转的条件

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块 set 指令:创建新的变量并设其值

rewrite的执行顺序

(1) 执行 server 块里面的 rewrite 指令。
(2) 执行 location 匹配。
(3) 执行选定的 location 中的 rewrite 指令。
 

rewrite的语法格式

rewrite <regex> <replacement> [flag];
regex :表示正则匹配规则。
replacement :表示跳转后的内容。
flag :表示 rewrite 支持的 flag 标记。


###flag标记说明###
last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。
break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

rewrite的示例

基于域名的跳转:需要浏览器访问www.www.com时自动跳转到www.wwy.com

进入到nginx的配置文件中添加修改以下内容

检测语法没错,重启nginx

去到浏览器进行测试

输入

跳转

基于客户端 IP 访问跳转:要求只有192.168.75.20主机能正常访问网页,其他所有主机访问都会自动跳转到维护页面

进入到nginx的配置文件中添加修改以下内容

检测语法没错,重启nginx

去到浏览器,清楚完缓存,搜索

基于旧域名跳转到新域名后面加目录:现在访问的是 http://www.www.com/post/,现在需要将这个域名下面的访问都跳转到http://www.wwy.com/bbs/post/

 

进入到nginx的配置文件中添加修改以下内容

 

检测语法没错,重启nginx

去到浏览器搜索http://www.www.com/post/123.html

跳转

基于参数匹配的跳转:现在访问http://www.wwy.com/99跳转到http://www.wwy.com页面

  

进入到nginx的配置文件中添加修改以下内容

 

检测语法没错,重启nginx

去到浏览器搜索

跳转

将对http://www.wwy.com网站的所有请求跳转到自定义的维护页面

   

进入到nginx的配置文件中添加修改以下内容

 

检测语法没错,重启nginx

去到浏览器搜索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/237048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C# 任务的异常和延续处理

写在前面 当Task在执行过程中出现异常或被取消等例外的情况时&#xff0c;为了让执行流程能够继续进行&#xff0c;可以使用延续方法实现这种链式处理&#xff1b;还可以针对前置任务不同的执行结果&#xff0c;选择执行不同的延续分支方法。子任务执行过程中的任何异常都会被…

【收获】成长之路

目录 一、前言二、计算机方面三、专业知识方面四、总结 一、前言 四年&#xff0c;对于一个人的成长来说&#xff0c;是一个相当重要的阶段。在这段时间里&#xff0c;我经历了许多挑战、收获了许多成就&#xff0c;也在不断地成长和改变。回首这四年的点点滴滴&#xff0c;我深…

linux docker 怎么更换镜像源

要设置Docker镜像&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 打开终端并登录到Docker主机上。 运行以下命令来编辑 Docker 的配置文件 "/etc/docker/daemon.json"&#xff08;如果不存在则新建&#xff09;&#xff1a; sudo nano /etc/docker/daemon.js…

Django系列之Celery异步框架+RabbitMQ使用

在Django项目中&#xff0c;如何集成使用Celery框架来完成一些异步任务以及定时任务呢&#xff1f; 1. 安装 pip install celery # celery框架 pip install django-celery-beat # celery定时任务使用 pip install django-celery-results # celery存储结果使用2. Django集成…

URIBuilder与SSRF

在使用一个静态扫描工具时&#xff0c;报了一个SSRF的问题&#xff0c;经过数据流的分析&#xff0c;导致此工具报SSRF的原因是在调用URIBuilder的setPath函数时&#xff0c;参数是从请求里获取的&#xff0c;导致了数据流被污染&#xff0c;因此认为由URIBuilder构造的URL也被…

作为一个产品经理带你了解Axure的安装和基本使用

1.Axure的简介 Axure是一种强大的原型设计工具&#xff0c;它允许用户创建交互式的、高保真度的原型&#xff0c;以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型&#xff0c;以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…

【EI会议征稿中|JPCS出版】第三届电子与集成电路技术国际学术会议(EICT 2024)

第三届电子与集成电路技术国际学术会议&#xff08;EICT 2024&#xff09; 2024 3rd International Conference on Electronics and Integrated Circuit Technology 第三届电子与集成电路技术国际学术会议&#xff08;EICT 2024&#xff09;将于2024年4月12至14日在南昌市举行…

Vue3封装一个轮播图组件

先看效果 编写组件代码 CarouselChart.vue <template><div classimg-box><el-button clickpreviousImages v-ifprops.showBtn>←</el-button><div classimg><div styledisplay: flex;gap: 20px idmove><imgclassimg-item v-for(item…

Github上火爆的个人知识管理AI大脑:Quivr

Github上火爆的个人知识管理AI大脑&#xff1a;Quivr。 演示视频&#xff1a; Github上火爆的个人知识管理AI大脑&#xff1a;Quivr 点击上面视频观看&#xff01;&#xff01;&#xff01; II. Quivr 的强大功能 与文件和应用程序聊天 把你的文件和应用看成你的对话伙伴&…

“险棋”更是“好棋”,鸿蒙生态为什么值得加入?

作者 | 曾响铃 文 | 响铃说 支付宝大张旗鼓与鸿蒙合作后&#xff0c;已经有高德地图、哔哩哔哩、阿里钉钉、美团、支付宝、小红书等十多个领域的独角兽企业集体宣布将开发鸿蒙原生应用&#xff0c;携手华为共同推动鸿蒙生态发展。 早前&#xff0c;有关华为鸿蒙系统可能将于…

Java中的IO流③——转换流、序列化流、反序列化流、打印流

目录 转换流 代码演示 总结 序列化流&反序列化流 序列化流 构造和成员方法 细节 代码演示 反序列化流 代码演示 序列化流和反序列化流细节 综合练习 打印流 字节打印流 代码演示 字符打印流 代码演示 总结 转换流 转换流可以将字节流转成字符流&#xff0…

【MySQL】:表的操作

表的操作 一.创建表二.查看表结构三.修改表四.删除表 一.创建表 field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指定字符集&#xff0c;则以所在数据库的字符集为准。 collate 校验规则&#xff0c;如果没有指定校验规则&#xff0c;则以…

侯捷C++ 程序的生前死后

生前&#xff1a;CRT startup code 看完课程&#xff0c;能够回答一下问题&#xff1a; C进入点是main()嘛&#xff1f;什么代码比main更早执行&#xff1f;什么代码在main结束后执行&#xff1f;为什么上述代码可以如此行为&#xff1f;Heap的结构如何&#xff1f;I/O的结构…

redis(设置密码)配置文件详细

1.设置账号密码端口 config set requirepass 123456 设置密码为123456 config get requirepass 查看账号密码 auth 123456 登入的时候输入这个确定账号密码 1. 首先连接到Redis服务器: redis-cli 2. 然后使用CONFIG SET命令设置requirepass参数并指定密码: CONFIG SET requi…

代码随想录二刷| 二叉树 |二叉树的所有路径

代码随想录二刷&#xff5c; 二叉树 &#xff5c;二叉树的所有路径 题目描述解题思路递归 代码实现递归 题目描述 257.二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节…

AP9111手电筒专用集成电路芯片 单节干电池 LED手电筒IC

概述 AP9111 是 LED 手电筒专用集成电路芯片 &#xff0c;是一款采用大规模集成电路技术&#xff0c;专门针对单节干电池的 LED 手电筒设计的一款专用集成电路。外加 1 个电感元件&#xff0c;即可构成 LED 手电筒驱动电路板。AP 9111 性能优越、可靠性高、使用简单、生产一致…

Java - JVM内存区域的划分

Java 程序运行时&#xff0c;需要在内存中分配空间。为了提高运算效率&#xff0c;就对空间进行了不同区域的划分&#xff0c;因为每一片区域都有特定的处理数据方式和内存管理方式。 分配&#xff1a;通过关键字new创建对象分配内存空间&#xff0c;对象存在堆中。 释放 &…

编译 Flink代码

构建环境 JDK1.8以上和Maven 3.3.x可以构建Flink&#xff0c;但是不能正确地遮盖某些依赖项。Maven 3.2.5会正确创建库。所以这里使用为了减少问题选择 Maven3.2.5版本进行构建。要构建单元测试&#xff0c;请使用Java 8以上&#xff0c;以防止使用PowerMock运行器的单元测试失…

011 数据结构_哈希

前言 本文将会向你介绍哈希概念&#xff0c;哈希方法&#xff0c;如何解决哈希冲突&#xff0c;以及闭散列与开散列的模拟实现 1. 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经…

【MATLAB】基于CEEMDAN分解的信号去噪算法(基础版)

代码的使用说明 【MATLAB】基于CEEMDAN分解的信号去噪算法&#xff08;基础版&#xff09; 代码流程图 代码效果图 获取代码请关注MATLAB科研小白的个人公众号&#xff08;即文章下方二维码&#xff09;&#xff0c;并回复CEEMDAN去噪 本公众号致力于解决找代码难&#xff0c;…