Nginx location匹配优先级 与 Rewrite

目录

  • 前言
    • location
    • location 常用的匹配规则
    • location 优先级
    • 实例演示
  • rewrite前言
    • rewrite跳转实现
    • rewrite 执行顺序
    • 语法格式
    • rewrite全局变量
    • 实例演示

前言

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

location

  • location 大致可以分为三类
    • 精准匹配:location = / {…}
    • 正则匹配:location ~ / {…}
    • 一般匹配:location / {…}

location 常用的匹配规则

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

location 优先级

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

实例演示

/usr/local/nginx/html 目录
在这里插入图片描述

配置文件:vim /usr/local/nginx/conf/nginx.conf
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • location 匹配

    • 首先看 优先级:精确= > 前缀^~ > 正则~,~* > 一般 > 通用 /
  • 优先级总结:

    • (location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分前缀路径) > (location /)
  • 在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location

  • 如果最长的前缀匹配带有 ^~ 则不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location

    • 前缀匹配看长度,最长的优先匹配
    • 正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求
    • 只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

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 <regex> <replacement> [flag];
    • regex :表示正则匹配规则。
    • replacement :表示跳转后的内容。
      • 默认情况下只会y对域名后面从根目录开始到?前面的url进行重写
      • 全路径重写得加上协议和域名 http://域名/url路径
    • flag :表示 rewrite 支持的 flag 标记。
    • lag标记说明
      • last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中。
      • break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在 location 中。
      • redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址。
      • permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
  • redirect和permanent 的意思就是
    • 旧域名+URL,通过rewrite转换成新的域名+URL,在通过浏览器访问,去匹配location 跳转页面,并浏览器地址栏也会显示重写后的地址
    • 默认情况是旧域名+URL,通过rewrite转换成新的域名+URL,去匹配location 跳转页面,不会在通过浏览器去在访问一遍,地址栏也是旧的域名地址。
      在这里插入图片描述

rewrite全局变量

在这里插入图片描述

实例演示

1.基于域名的跳转
现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.ccc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.ccc.com-access.log;		#日志修改location / {#添加域名重定向if ($host = 'www.ccc.com'){						#$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.bbb.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串}root   html;index  index.html index.htm;}
}
echo "192.168.60.5 www.ccc.com www.bbb.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.ccc.com/(虽然这个请求内容是不存在的)
会跳转到www.bbb.com/,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

在这里插入图片描述
2.基于客户端 IP 访问跳转
今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.80.10访问正常。

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.ccc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.ccc.com-access.log;		#日志修改#设置是否合法的IP标记set $rewrite true;							#设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.60.5"){		#当客户端IP为192.168.60.5时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){						#当变量值为true时,进行重写rewrite (.+) /weihu.html;				#将域名后边的路径重写成/weihu.html后转发,例如www.kgc.com/weihu.html}location = /weihu.html {root /var/www/html;						#网页返回/var/www/html/weihu.html的内容}location / {root   html;index  index.html index.htm;}
}
mkdir -p /var/www/html/
echo "<h1>We are maintaining now!</h1>" > /var/www/html/weihu.html
systemctl restart nginx
只有 IP 为 192.168.60.5 能正常访问,其它地址都是维护页面

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

小白必看!轻松理解和解决MySQL幻读问题!

大家好&#xff0c;我是小米&#xff01;今天我来给大家分享一下关于MySQL数据库中常见的一个问题——幻读&#xff0c;以及如何解决它。相信对于数据库开发和管理的小伙伴们来说&#xff0c;幻读是一个相对棘手的问题&#xff0c;但只要我们掌握了正确的解决方法&#xff0c;它…

绿色荧光试剂210236-90-1,FITC Tyramide,Fluorescein-Tyramide

●中文名&#xff1a;荧光素酪胺 ●英文名&#xff1a;FITC Tyramide&#xff0c;Fluorescein-Tyramide&#xff0c;FITC TSA &#xff08;文章编辑资料汇总来源于&#xff1a;陕西新研博美生物科技有限公司小编MISSwu&#xff09;​ ●外观以及性质&#xff1a; 荧光素酪胺…

emz文件打开

1. 打开word 2. 插入图片 3. 选择需要打开的emz文件 4. done

Windows11系统下解压文件后缀为.tar(.gz)的压缩文件

第一步&#xff1a;进入解压文件所在的当前文件夹内右键点击在终端打开 第二步&#xff1a;在终端内输入tar -zxvf xxx.tar.gz&#xff08;如果是.tar.gz文件就输入该行指令&#xff0c;如果是.tar文件就输入tar -zxvf xxx.tar指令&#xff0c;其中xxx为文件名&#xff09; 第三…

成熟GPT小程序源码分享,快速搭建GPT小程序

本文中分享成熟的GPT小程序源码&#xff0c;帮助你快速搭建自己的GPT小程序。 GPT小程序源码介绍 GPT小程序源码是一套成熟的GPT编程框架&#xff0c;可以帮助你快速开发高质量的GPT小程序。该源码包含了丰富的功能模块和优秀的编程实践&#xff0c;可以帮助你轻松实现GPT小程…

.ziw文件是什么?如何打开.ziw文件?

.ziw文件是为知笔记的一种文档格式打开方式&#xff1a;找到为知笔记的官网&#xff0c;下载它的windows安装包即可 [缺点&#xff1a;该软件会有一个使用的有效期] 打开.ziw文件时&#xff0c;右击选择发送到“为知笔记”&#xff0c;选择相应的文件夹保存即可

GDS文件如何打开?

GDS文件是一种“版图”文件。用于生产 光刻工艺所需的 掩膜版。 使用 KLayout 软件打开 KLayout 是一个 GDS 和 OASIS 文件 查看器 KLayout 也是一个允许更改 GDS 和 OASIS 文件并从头开始创建它们的 编辑器 KLayout 是 免费的 KLayout 官网&#xff1a;https://www.klayou…

html解压zip文件怎么打开方式,zip文件是什么文件,如何打开zip格式的文件?

zip文件是小编经常要用到的文件&#xff0c;因为zip文件不仅在windows平台里面有用&#xff0c;而且在linux平台里面也可以用&#xff0c;二个平台都兼容&#xff0c;压缩的也很好&#xff0c; 所以&#xff0c;小编非常喜欢zip压缩的文件。下面&#xff0c;小编就来为大家介绍…

linux下压缩gz文件怎么打开,在Linux系统中打开或解压缩.gz文件及提取tar.gz文件的方法...

本文本文介绍如何打开(或解压缩).gz文件的方法。Gzip是一种流行的压缩算法&#xff0c;可在保持原始文件模式、所有权和时间戳的同时减小文件大小&#xff0c;此算法通常用于压缩Web元素&#xff0c;以加快页面加载速度。按照约定&#xff0c;使用gzip压缩的文件以.gz或.z结尾。…

linux显示 zbj目录下的文件,ZBJ 文件扩展名: 它是什么以及如何打开它?

解决难以打开 ZBJ 文件的问题 打开 ZBJ 文件过程中所遇到的常见问题 Unknown Software 已删除 尝试打开 ZBJ 时&#xff0c;你会遇到一条错误消息&#xff0c;例如 “%%os%% 无法打开 ZBJ 文件”。 通常情况下&#xff0c;这意味着 Unknown Software 没有安装在 %%os%% 上。 您…

计算机用户名uz,UZ 文件扩展名: 它是什么以及如何打开它?

UZ 文件并发症 打开 UZ 文件的问题 Unreal Tournament 消失 你尝试加载 UZ 文件并收到错误&#xff0c;例如 “%%os%% 无法打开 UZ 文件扩展名”。 如果是这种情况&#xff0c;通常是因为 你的计算机上没有安装 Unreal Tournament for %%os%%。 操作系统不知道如何处理你的 UZ …

vue3+element-plus的后台管理系统模板 和 vue3+ant-design-vue的后台管理系统模板

项目介绍 规范&#xff1a;后台系统模板&#xff0c;按照企业级别的规范搭建的。 权限控制&#xff1a;通过后端返回的路由表&#xff08;这个路由表是由前端这边在系统配好的然后存储在后端的&#xff09;来动态渲染菜单和注册路由&#xff0c;同时也根据页面内的接口权限对页…

科研热点|科研人专属身份证来了,国产ORCID ID启动!

2023年6月1日&#xff0c;国家自然科学基金委员会发布了《国家自然科学基金委员会关于推广和发布基础研究科研人员标识&#xff08;BRID&#xff09;有关工作安排的通告》&#xff0c;宣布从即日起&#xff0c;国家自然科学基金委员会&#xff08;以下简称自然科学基金委&#…

技术分享 | App常见bug解析

【摘要】 功能Bug内容显示错误前端页面展示的内容有误。这种错误的产生有两种可能1、前端代码写的文案错误2、接口返回值错误功能错误功能错误是在测试过程中最常见的类型之一&#xff0c;也就是产品的功能没有实现。比如图中的公众号登录不成功的问题。界面展示错乱产品界面上…

yolov3

文章目录 前言一、主干网络darknet53二、从特征获取预测结果 前言 本文主要讲解yolov3的基本知识&#xff0c;如有错误请指出。 本文主要来自 博客1 博客2 一、主干网络darknet53 53是因为有53层。 1、darknet53没有使用pooling 来进行下采样&#xff0c;而是用一个33&…

C语言:计算n的阶乘(不考虑溢出)

题目&#xff1a; 从键盘输入一个值n&#xff0c;计算n的阶乘&#xff0c; 如&#xff1a;输入5&#xff0c;计算5的阶乘 --> 5! 1 * 2 * 3 * 4 * 5 思路&#xff1a; 第一步&#xff1a; 创建一个变量 ret &#xff0c;用来存放每次相乘后的值&#xff0c; 因为 0 乘 任何…

java排列组合(递归算法)

一、排列 1、计算公式如下&#xff1a; 2、使用方法&#xff0c;例如在1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5中取3个数排列&#xff1a; 3、全排列 当mn时&#xff0c;结果为全排列。例如1&#xff0c;2&#xff0c;3&#xff0c;4的全排列如下&#xff1…

算法中的排列与组合

排列组合公式 不含重复元素的排列组合 含有重复元素的排列组合 如果产生的组合和排列可以包含有重复的元素&#xff0c;其实这类问题在苏荷数学上是多种集的排列和组合问题。 多重集的排列问题 设S是有k种不同类型对象的多重集合&#xff0c;每个元素都有无限的重复数。那么…

排列组合 交叉组合 组合排列算法

20180619 一&#xff0c;交叉组合排列算法&#xff1a; 1、前言&#xff1a; 在项目开发的过程中负责全系统查询检索的一个模块&#xff0c;其中有一个查询方式叫做“交叉组合查询”&#xff0c;与数学中的排列组合类似&#xff0c;因此就开始想看一下这个该怎么写&#xff0c;…