当前位置: 首页 > news >正文

DAY 48 Nginx的 location与rewrite模块

[正则表达式]

常用的[Nginx] 正则表达式


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

访问路由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 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高

优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ,* 正则顺序) > (location 部分起始路径) > (location /

实际网站使用中的三个匹配规则定义

第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。
这里是直接转发给后端应用服务器了,也可以是一个静态首页

 location = / {proxy_pass http://tomcat_server/;
}

第二个必选规则是处理静态文件请求

这是nginx作为http服务器的强项!
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用

 location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;

第三个规则就是通用规则,

比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求

 location / {
proxy_pass http://tomcat_server;
}

访问重写rewrite

rewrite的概述

rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,\

rewrite 执行顺序如下:

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

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

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

rewrite 示例

实验1:基于域名的跳转

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

server {listen       80;server_name  www.cxk.com;										#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;		#日志修改location / {													#添加域名重定向if ($host = 'www.cxk.com'){									#$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.cxk2.com/$1 permanent;		#$1为正则匹配的内容,即域名后边的字符串}root   html;index  index.html index.htm;}
}

mkdir -p /usr/local/nginx/html/testvim /usr/local/nginx/html/test/1.htmlecho "192.168.137.20 www.cxk.com www.cxk2.com" >> /etc/hostssystemctl restart nginx					#重启服务

浏览器输入模拟访问 www.cxk.com/test/1.html… 会跳转到www.cxk2.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转

实验2:基于客户端 IP 访问跳转

要求:今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.137.15访问正常

server {listen       80;server_name  www.zjl.com;												#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;				#日志修改#设置是否合法的IP标记set $rewrite true;							#设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.137.20"){		#当客户端IP为192.168.184.200时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){						#当变量值为true时,进行重写rewrite (.+) /weihu.html;				#重写在访问IP后边插入/weihu.html,例如192.168.80.11/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 busy now!</h1>" > /var/www/html/weihu.html
systemctl restart nginx

实验3:基于旧域名跳转到新域名后面加目录

现在访问的是 mail.cxk.com/post,现在需要将这…

server {listen       80;server_name  bbs.cxk.com;									#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;#添加location /post {rewrite (.+) http://www.cxk.com/mail$1 permanent;		#这里的$1为位置变量,代表/post}location / {root   html;index  index.html index.htm;}
}mkdir -p /usr/local/nginx/html/bbs
echo "this is 1.html"  >> /usr/local/nginx/html/mail/1.html
echo "192.168.137.20 bbs.cxk.com"  >> /etc/hosts
systemctl restart nginx

实验4:基于参数匹配的跳转

	listen       80;server_name  www.cxk.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.*) http://www.cxk.com permanent;}location / {root   html;index  index.html index.htm;}
}systemctl restart nginx

实验5:基于目录下所有 php 结尾的文件跳转

	listen       80;server_name  www.cxk.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;location ~* /upload/.*\.php$ {rewrite (.+) http://www.cxk.com permanent;}location / {root   html;index  index.html index.htm;}
}
systemctl restart nginx

实验6:基于最普通一条 url 请求的跳转

	listen       80;server_name  www.cxk.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.cxk.com-access.log  main;location ~* ^/abc/123.html {rewrite (.+) http://www.cxk.com permanent;}location / {root   html;index  index.html index.htm;}
}
systemctl restart nginx

相关文章:

DAY 48 Nginx的 location与rewrite模块

[正则表达式] 常用的[Nginx] 正则表达式 $ &#xff1a;匹配输入字符串的结束位置* &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” &#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”&#xff0c;但不能匹配“…...

Linux 常用操作技巧

Linux 操作技巧大全 Linux是一种强大的操作系统&#xff0c;掌握各种操作技巧可以帮助我们惬意地使用它。在这篇博客中&#xff0c;我们将分享一些实用的Linux技巧&#xff0c;希望能对您有所帮助&#xff01; 1. 使用Tab进行自动补全 在输入命令时&#xff0c;按下Tab键可…...

BetaFlight统一硬件配置文件研读之timer命令

BetaFlight统一硬件配置文件研读之timer命令 1. 源由2. 代码分析3. 实例分析4. 配置情况4.1 AFn配置查表4.2 timer4.3 timer show4.4 timer pin list 5. 参考资料 统一硬件配置文件的设计是一种非常好的设计模式&#xff0c;可以将硬件和软件的工作进行解耦。 1. 源由 cli命令…...

码出高效:Java开发手册笔记(java对象四种引用关系及ThreadLocal)

码出高效&#xff1a;Java开发手册笔记&#xff08;java对象四种引用关系及ThreadLocal&#xff09; 前言一、引用类型二、ThreadLocal价值三、ThreadLocal副作用 前言 “水能载舟&#xff0c;亦能覆舟。”用这句话来形容 ThreadLocal 最贴切不过。ThreadLocal 初衷是在线程并…...

为什么要进行数据决策?数据决策对企业而言有何重要意义?

“大数据”几乎已成为时下最时髦的词汇&#xff0c;不夸张地说&#xff0c;当今各行各业无不对大数据充满了向往&#xff0c;希望自己在新一轮的大数据营销中抢占先机。同时&#xff0c;从大数据中引申出的数据挖掘、数据分析、数据安全等数据运用技术也成为人们热捧的焦点。 …...

2. Java 异常体系

2.1 Throwable java.lang.Throwable 类是 Java 程序执行过程中发生的异常事件对应的类的根父类。 Throwable 中的常用方法&#xff1a; public void printStackTrace()&#xff1a;打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得…...

如何学好STM32,需要哪些步骤?

学习STM32应用于项目开发需要以下步骤&#xff1a; 学习STM32的基本知识&#xff1a;包括STM32的架构、寄存器、外设等&#xff0c;理解STM32的工作原理和基本操作方法。 学习嵌入式系统和RTOS的基础知识&#xff1a;了解嵌入式系统的概念、RTOS的基本原理和使用方法&#xff…...

武忠祥老师每日一题||不定积分基础训练(四)

∫ d x 1 x 3 \int \frac{\rm dx}{1x^3} ∫1x3dx​ 解法一&#xff1a; 待定系数法&#xff1a; ∫ d x 1 x 3 \int \frac{dx}{1x^3} ∫1x3dx​ ∫ d x ( 1 x ) ( x 2 − x 1 ) \int \frac{dx}{(1x)(x^2-x1)} ∫(1x)(x2−x1)dx​ 1 3 ∫ ( 1 x 1 − x 2 x 2 − x …...

记一次产线打印json导致的redis连接超时

服务在中午十一点上线后&#xff0c;服务每分钟发出三到四次redis连接超时告警。错误信息为&#xff1a; Dial err:dial tcp: lookup xxxxx: i/o timeout 排查过程 先是检查redis机器的情况&#xff0c;redis写入并发数较大&#xff0c;缓存中保留了一小时大概400w条数据。red…...

FPGA入门系列12--RAM的使用

文章简介 本系列文章主要针对FPGA初学者编写&#xff0c;包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解&#xff0c;旨在更快速的提升初学者在FPGA开发方面的能力&#xff0c;每一个章节中都有针对性的代码…...

【三十天精通Vue 3】第二十六天 Vue3 与 TypeScript 最佳实践

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、为什么使用TypeScript&#xff1f;二、Vue 3和TypeScript…...

ffmpeg-mov-metadate不识别Bug修复

文章目录 BUG起因类似问题反馈问题解决具体步骤&#xff1a; 阅读过文章ffmpeg命令行解析调试流程记录movenc.c源码分析 BUG起因 在ffmpeg参数默认可识别的metadata参数如下&#xff1a; 具体可见libavformat/movenc.c->mov_write_udta_tag() mov_write_string_metadata(s,…...

(8)(8.6) 引导程序更新

文章目录 前言 1 我在哪里可以下载最新的引导程序? 2 使用任务规划器进行升级...

汽车电路图、原理框图、线束图、元器件布置图的识读技巧与要点

摘要&#xff1a; 想要读懂汽车电路图就必须把电的通路理清楚&#xff0c;即某条线是什么信号&#xff0c;该信号是输入信号、输出信号还是控制信号以及信号起什么作用&#xff0c;在什么条件下有信号&#xff0c;从哪里来&#xff0c;到哪里去。 一、汽车电路图的识读技巧 1.…...

( 数组和矩阵) 667. 优美的排列 II ——【Leetcode每日一题】

❓667. 优美的排列 II 难度&#xff1a;中等 给你两个整数 n 和 k &#xff0c;请你构造一个答案列表 answer &#xff0c;该列表应当包含从 1 到 n 的 n 个不同正整数&#xff0c;并同时满足下述条件&#xff1a; 假设该列表是 answer [a1, a2, a3, ... , an] &#xff0…...

【python基础语法七】python内置函数和内置模块

内置全局函数 abs 绝对值函数 print(abs(-1)) # 1 print(abs(100)) # 100round 四舍五入 """奇进偶不进(n.5的情况特定发生)""" res round(3.87) # 4 res round(4.51) # 5 # res round(2.5) # 2 # res round(3.5) # 4 res round(6.5) # …...

81. read readline readlines 读取文件的三种方法

81. read readline readlines 读取文件的三种方法 文章目录 81. read readline readlines 读取文件的三种方法1. 读取文件的三种方法2. read方法3. readline方法4. readlines方法5. 代码总结5.1 read方法读取全部内容5.2 readline方法读取一行&#xff0c;返回字符串5.3 readli…...

【社区图书馆】【图书活动第四期】

目录 一、前言 二、作者简介 三、《PyTorch高级机器学习实战》内容简介 四、书目录 一、前言 今天&#xff0c;偶尔逛到csdn社区图书馆&#xff0c;看到有活动 “【图书活动第四期】来一起写书评领实体奖牌红包电子勋章吧&#xff01;”&#xff08;活动到今天结束&#xf…...

webpack学习指南(上)

构建流程 Webpack 的构建流程可以分为以下几个步骤&#xff1a; 解析配置文件&#xff1a;Webpack 会读取项目中的 webpack.config.js 文件&#xff0c;并解析其中的配置项。 解析入口文件&#xff1a;Webpack 通过配置文件中设置的 entry 入口&#xff0c;递归地解析出所有依…...

刷题记录˃ʍ˂

一、1033. 移动石子直到连续 思路 这道题是一道数学题&#xff0c;它一共分为三种可能 第一种可能为三个石子本来就是连续的时候 第二种可能为最少步数为1的时候&#xff0c;相邻石子不能大于一格 第三种可能为最少步数为2的时候&#xff0c;这时相邻石子大于一格 那么第二…...

Word2vec原理+实战学习笔记(二)

来源&#xff1a;投稿 作者&#xff1a;阿克西 编辑&#xff1a;学姐 前篇&#xff1a;Word2vec原理实战学习笔记&#xff08;一&#xff09; 视频链接&#xff1a;https://ai.deepshare.net/detail/p_5ee62f90022ee_zFpnlHXA/6 5 对比模型&#xff08;论文Model Architectur…...

什么是Java的多线程?

Java的多线程是指在同一时间内&#xff0c;一个程序中同时运行多个线程。每个线程都是一个独立的执行路径&#xff0c;可以独立地执行代码。Java中的多线程机制使得程序可以更高效地利用计算机的多核处理器和CPU时间&#xff0c;从而提高程序的性能和响应能力。 创建和使用Jav…...

“use strict“是什么? 使用它有什么优缺点?

严格模式 - JavaScript | MDN Javascript 严格模式详解 - 阮一峰的网络日志 1、"use strict" 是什么? "use strict" &#xff1a;指定代码在严格条件下执行&#xff1b; 2、 使用 "use strict" 有什么优缺点&#xff1f; ① 严格模式通过抛出错…...

【C++】C++11常用特性总结

哥们哥们&#xff0c;把书读烂&#xff0c;困在爱里是笨蛋&#xff01; 文章目录 一、统一的列表初始化1.统一的{}初始化2.std::initializer_list类型的初始化 二、简化声明的关键字1.decltype2.auto && nullptr 三、STL中的一些变化1.新增容器&#xff1a;array &…...

泛型——List 优于数组

数组与泛型有很大的不同&#xff1a; 1. 数组是协变的&#xff08;covariant&#xff09; 意思是&#xff1a;如果Sub是Super的子类型&#xff0c;则数组类型Sub[] 是数组类型Super[] 的子类型。 2. 泛型是不变的&#xff08;invariant&#xff09; 对于任何两种不同的类型Ty…...

JavaScript中对象的定义、引用和复制

JavaScript是一种广泛使用的脚本语言&#xff0c;其设计理念是面向对象的范式。在JavaScript中&#xff0c;对象就是一系列属性的集合&#xff0c;每个属性包含一个名称和一个值。属性的值可以是基本数据类型、对象类型或函数类型&#xff0c;这些类型的值相互之间有着不同的特…...

JavaScript通过函数异常处理来输入圆的半径,输出圆的面积的代码

以下为实现通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积的代码和运行截图 目录 前言 一、通过函数异常处理来输入圆的半径&#xff0c;输出圆的面积 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 前言 1.若有选择&#xff0c;您可以…...

Ubuntu 安装 Mysql

主要内容 本文主要是实现在虚拟机 Ubuntu 18.04 成功安装 MySQL 5.7&#xff0c;并实现远程访问功能&#xff0c;以 windows 下客户端访问虚拟机上的 mysql 数据库。 1. 切换至 root 用户 &#xff0c;shell 终端指令均执行在 root 用户下 sudo su 2. 安装并设置 mysql 安…...

【五一创作】【Midjourney】Midjourney 连续性人物创作 ② ( 获取大图和 Seed 随机种子 | 通过 seed 随机种子生成类似图像 )

文章目录 一、获取大图和 Seed 随机种子二、通过 seed 种子生成类似图像 一、获取大图和 Seed 随机种子 注意 : 一定是使用 U 按钮 , 在生成的大图的基础上 , 添加 信封 表情 , 才能获取该大图的 Seed 种子编码 ; 在上一篇博客生成图像的基础上 , 点击 U3 获取第三张图的大图 ;…...

分布式事务 --- Seata事务模式、高可用

一、事务模式 1.1、XA模式 XA 规范 是 X/Open 组织定义的分布式事务处理&#xff08;DTP&#xff0c;Distributed Transaction Processing&#xff09;标准&#xff0c;XA 规范 描述了全局的TM与局部的RM之间的接口&#xff0c;几乎所有主流的数据库都对 XA 规范 提供了支持。…...

做网站在哪个程序做/宁波网站建设推广公司价格

国家集训队1999论文集陈宏&#xff1a;《数据结构的选择与算法效率——从IOI98试题PICTURE谈起》来煜坤&#xff1a;《把握本质&#xff0c;灵活运用——动态规划的深入探讨》齐鑫&#xff1a;《搜索方法中的剪枝优化》邵铮&#xff1a;《数学模型的建立、比较和应用》石润婷&a…...

网站导航如何用响应式做/google网站

、1 向量1起点在向量2左侧&#xff0c;终点在左侧&#xff1b;向量2起点在向量1右侧&#xff0c;终点在右侧 2 向量1起点在向量2右侧&#xff0c;终点在右侧&#xff1b;向量2起点在向量1左侧&#xff0c;终点在左侧 3 向量1起点在向量2右侧&#xff0c;终点在左侧&#xff1b;…...

网上学设计哪个网站好/网页开发工具

点击上方蓝字关注我们在射频 /微波/毫米波测试中&#xff0c;除了同轴和波导互连器件之外&#xff0c;还有其他两种与DUT交互的主要器件。它们包括连接到元件引线或微带焊盘的表面探针&#xff0c;以及设计用于测试的天线。测试探针和天线所适用的测试类型差异巨大&#xff0c;…...

php网站培训机构企业做网站/seo成功案例分析

本篇文章帮大家学习xml-RPC实例(java)&#xff0c;包含了XML-RPC实例(Java)使用方法、操作技巧、实例演示和注意事项&#xff0c;有一定的学习价值&#xff0c;大家可以用来参考。在本节中&#xff0c;将通过Java编程语言演示如何使用XML-RPC&#xff0c;首先创建一个使用Java类…...

公司网站打不开不知道谁做的/软文代写兼职

一、Java混合部分 1、对于同一类中的两个方法 , 在判断它们是不是重载方法时 , 肯定不考虑&#xff08; &#xff09; A、参数个数 B、参数类型 C、返回值类型 D、参数顺序 解析&#xff1a;C &#xff08;1&#xff09;方法的重载&#xff1a; 方法重载的定义&#xff1a;同一…...

住房和城乡建设委员会的官方网站/小程序推广赚佣金平台

更新2015.03.17&#xff1a;我在本文中表达的可访问性问题是错误的&#xff0c;并且是基于误解。 实际上&#xff0c;Shadow DOM和屏幕阅读器不存在此类可访问性问题 Shadow DOM是Web组件规范的一部分&#xff0c;旨在解决困扰某些Web开发的封装问题。 您知道这种事情–如果您构…...