rewrite详解

article/2025/10/21 20:22:16

rewrite模块

        URI跟URL介绍
        什么是uri?统一标识符,拿www.abc.com/aw/wd/举例,那么rui就是/aw/wd/这部分数据(也有可能是图片,html网页,如果是伪静态的话,那就得看配置是啥玩意了
        什么是url?  统一定位符,还是拿www.abc.com/aw/wd/举例,那么整个www.abc.com/aw/wd/就是url        

        什么是rewrite?
        rewrite重写是由ngx_http_rewrite_module模块提供,主要是实现URI改写功能,并且此模块是Nginx默认安装的模块。通过rewrite,用户可以实现url重定向,根据regex规则来匹配内容跳转到replacement,结尾以flag标记。


        工作方式
        rewrite匹配默认是按照从上至下的顺序进行匹配,如果没有添加flag参数,直到把最后一个rewrite匹配完才终止,如果最后一个都没有匹配到内容则返回500,如果想要提前终止就得flag参数来帮忙实现。


       rewrite模块常见指令

if (条件) {} #设定条件,再进行重写
       set     #后面+值,可以给变量赋值
       return  #返回状态码信息,并且支持自定义信息
       rewrite #重写 (这个是重点)
       rewrite_log # rewrite日志

      语法
        rewrite regex(正则) replacement(替换)  flag(标识);中间以空格隔开

      常用正则

^     以什么开头                                          
$     以什么结尾 
*     匹配前面的字符0次或者多次               
+     匹配前面的字符1次或者多次 
?     匹配前面字符0次或者1次                     
.     匹配除“\n \t”之外的单个字符(patten) 匹配括号内的patten(同时第一个() 就是$1 第二个是$2,$取值以()为分隔符)
[a-z0-9] 匹配里面的任意单个字符,区分大小写    d      匹配任意数字
\S     匹配可见字符                                        
\s     匹配不可见字符
\w     匹配任意单词(可以是单个字符,字符串等等) ac bh ki js n r          
x|y    匹配x或则匹配y(任意一个) | 或 
\W     匹配任意符号(可以是单个,也可以是多个) ? \ + - == [ ] { } -- ()  

      flag参数
        last        结束当前所有rewrite指令,并且使用新的URI直接进行location匹配。
        break    结束当前所有rewrite指令,不参与任何匹配,并且把当前输出作为结果返回给用户,避免重复rewrite。
        注:在server模块匹配中使用last,而在location功能模块中使用break
        redirect(临时)   返回302临时重定向
        permanent(永久的)  永久返回301重定向 
       注:301跟302跳转输出结果是一样的,但是主要是针对搜索引擎的,搜索引擎看见你的数据是302跳转,默认是不抓取的,301是抓取的,具体原因的话,那就不清楚了,在生产环境中,一般是301用的多


    例子:      

        last   结束当前所有rewrite指令,并且使用新的RUI进行下轮location匹配(但是匹配是有范围的,只匹配location的内容,上限是10次,10次没有匹配到内容,则返回500 ,容易造成死循环)。如果新的RUI是资源地址,则直接返回资源地址。
        break    结束当前所有rewrite指令,不参与任何匹配(包括后续rewrite,其它location),并且把当前URI用来处理用户请求,可以避免重复rewrite。

示例1:last与break大致区别

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ /break/ {rewrite /break/(.*) /test/$1 break; return 200 jfnginx;}location ~ /last/ {rewrite /last/(.*) /test/$1 last;return 200  "last";}location ~ /test/ {rewrite /test/ /a.html;}} 

注:根据break的特性,404是意料之中,return也是rewrite功能模块指令。

注:这个结果也是意料之中,根据last的特性,把/last 替换成 /test又开始了新一轮的location匹配,匹配到/test的内容取得具体资源地址,返回给用户

示例2:在server字段填写break,last与不填的区别

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;rewrite /break /downlod/wget-log last;rewrite /break /downlod/wget-log.1;location ~ /break/ {rewrite /break/(.*) /downlod/jfnginx.txt break;}}

注:经过反复测试在server字段的第一个rewrite重写规则只要指定具体RUI资源,那么就会返回当前资源,无论后面加不加参数都不会执行其他的rewrite指令及匹配location功能模块。

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;rewrite /break /downlod/ break;rewrite /break /user/;location ~ /downlod/ {rewrite /downlod/(.*) /downlod/jfnginx.txt break;}location ~ /user/ {rewrite /user/(.*) /user/706342.html break;}}# curl ab.text.com/break/9289897df.html
jfnginx

注:经过3次测试(分别flag位置的参数设置为last,break,空),当server字段的rewrite的RUI指定是一个目录的时候,无论是后面有没有flag参数,都会根据RUI跳转,去匹配location功能模块,返回固定值。(一般在server字段需要强制跳转大部分是用permanent去处理)

示例3:在location功能模块测试breakt填写位置不同的结果展示

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ /break/ {rewrite /break/(.*) /downlod/ brake;}location ~ /downlod/ {rewrite /downlod/(.*) /user/706342.html break;}}# curl ab.text.com/break/923us2u.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>
##################################################################
server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ /break/ {rewrite /break/(.*) /downlod/;break;}location ~ /downlod/ {rewrite /downlod/(.*) /user/706342.html break;}}# curl ab.text.com/break/9222ee2u.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>###################################################################
server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ /break/ {rewrite /break/(.*) /downlod/ break;return 200 "jfnginx \n";}location ~ /downlod/ {rewrite /downlod/(.*) /user/706342.html break;}}# curl ab.text.com/break/9222ee22wewu.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

注:根据上面的测试结果 break 是结束当前rewrite重写,无论后面还有没有rewrite或者是其它location模块都不匹配。last就不测试了,在示例1里面就有展示。

        redirect(临时)   返回302临时重定向

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ / {rewrite ^/bc http://ab.text.com/b.html redirect;}


    permanent(永久的)  永久返回301重定向 

示例:
server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ / {rewrite ^/ac http://ab.text.com/a.html permanent;}

#跳转成功,但是做301或者302跳转的时候后面的内容一定要加协议,不然会把你跳转的内容当成一个文件去处理。301及301跳转是跳转至全新的内容,对访问方式以及就行了修改。

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;rewrite_log on;location ~ ^/downlod/ {rewrite ^/downlod /downlod/jfnginx.txt;return 200 "jfnginx \n";}

return  #用于返回状态码信息,并且支持自定义信息了,并且return还有终止rewrite的作用

语法:return code [描述信息]; 示例:return 403;return code URL;    示例:return 301 https://ab.test.com/s/;return URL;         示例:return  https://ab.test.com/s/;返回常见状态码:
403 
404
444    #比较特殊的状态码,返回这个的话,客户端是看不到状态码的。
301
302
及其他自定义状态码示例:server {listen 80;server_name ab.text.com;index index1.html;root /data/www;location ~ /break/ {rewrite /break/(.*) /downlod/;return 200 "jfnginx \n";}location ~ /downlod/ {rewrite /downlod/(.*) /user/706342.html break;}}# curl ab.text.com/break/9222ee22wewu.htmljfnginx 

注:根据上述结果测试,return跟break功能是差不多的,但是return可以接返回码及描述信息(此码与http协议码还是有区别的,这个码是属于自定义的)

error_page 返回错误

error_page指令是一个错误处理指令,核心功能就是多错误进行处理.
语法:error_page code ..[=[response]] uri;示例:error_page 404 /404.html;    #只要是产生404就调整到 404.html,同时会继承404的状态码error_page 500 502 503 504 /50x.html;    #只要是 500,502,503,504报错就调整到 50x.htmlerror_page 404 = /test/;    #只要是404就跳转到 /test/,此时返回状态码会修改为 200error_page 404 = /404.php   #只要是404就调转到 404.php,此时返回的状态为 200error_page 403 http://example.com/forbideen.html;    #只要是403就调整到固定页面error_page 404 = 301 http://example.com/example.html    #只要是404就跳转到后面地址,状态码为301注:有个说明就是 error_page 后面加不加等号区别就是:加等会,返回的状态码自动改为 200,不加就继承上次的状态,比如403,404等状态都会被继承小干货:
在有的生产环境,你通过error_page做了404或者500等跳转,结果发现没有跳转,你不仿在当前server块开启如下指令:proxy_intercept_errors on;  #它会主动获取错误信息,使你的error_page跳转生效

if (条件) {}   #设定条件,再进行重写

语法:if (condition){...} 如果condition为真,则执行{...}的内容,condition有以下3种情况:当条件为变量(自定义变量或系统变量)时,值为空或者任何以0开头的字符串都被当做flase.
直接比较变量值的时候用 = 或 !=
~ 为正则匹配 ~*不区分大小写匹配 !~区分大小写的不匹配
-e -f -d -x 跟正则的里面的是一个意思 加 ! 非的意思 也就是 不等于# $request_filename指的是请问资源路劲, !-e 代表不存在
server {listen 80;server_name ab.text.com;index index1.html;root /data/www;if ( !-e $request_filename ) {rewrite (.*) /a.html;}
}
注:当请求的资源不存在的时候,全部转到a页面# curl ab.text.com/break/9222ee22wewu.html
#这是a页面
是不是很意外?是不是很惊喜?这就是我的a页面。<!--引入b.html--><!--# include file="b.html" -->其它例子:#做防盗链,如果referer为空就禁止访问,注意if不支持逻辑或与逻辑与,需要多个逻辑判断得多个if组合一起if ($http_referer "") {return 403;    }

try-files 主要对没有匹配到的数据进行处理

语法:
try_files file ... uri;
try_files file ... =code;
适用字段:server, location
注:try_files 最后面是可以接uri或者源码的。示例:
try_files $uri $rui/ =403;  
try_files $uri $rui/ /a.html;
try_files $uri $rui/ @user;    
#对进行域名访问的请求进行匹配,如果server没有数据则强制返回404。
#其中前2个$uri是匹配内部数据,只有最后那个参数才起到重定向的功能#综合配置
server {listen 80;server_name ab.text.com;index index1.html;root /data/www;try_files $uri @user;location  @user{rewrite ^(.*) /a.html break;}
}示例1:ssd.html文件并不存在
# curl ab.text.com/ssd.html            #访问结果直接跳转到a页面
#这是a页面
是不是很意外?是不是很惊喜?这就是我的a页面。<!--引入b.html--><!--# include file="b.html" -->示例2:ssdj.html 存在在根目录之下
# echo ssdj > ssdj.html
# ls
404.html  a.html  b.html  downlod  index1.html  ssdj.html  user
# curl ab.text.com/ssdj.html        #返回是当前页面的值
ssd

set指令 定义一个变量,并给变量赋值。变量的值可以为文本、变量或者变量的组合。set $var "hello world"  

使用环境:server,location,if 

server {listen 80;server_name ab.text.com;index index1.html;root /data/www;if ( !-e $request_filename ) {rewrite (.*) /downlod;set $ac "2200 \n";return 200 $ac;}
}# curl ab.text.com/ssdsd
2200 比如我需要做防盗链,只要ua(user-agent)为"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"及referer为空的请求禁止访问。server {listen 80;server_name ab.text.com;index index1.html;root /data/www;set $p 0;    #设置变量p,值为0if ($http_user_agent = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36"){set ${p}1;    #如果上面的if执行成功,则再次设置变量p值为01,因为${p}是继承了上面那个$p的值。}if ($http_referer = ""){set ${p}2;    #如果上面的if执行成功,就再次赋值,此时p的值为012,${p}继承的是01,然后组合起来是012}if ($p = 012 ){return 403;    #最终判断,如果p的值为012,在代表上面的条件都匹配,我们就返回403}}#因为Nginx的if不支持逻辑或跟逻辑与,我们只能通过对变量赋值的方式,对用户的请求进行判断,如果符合要求则赋值,最终根据值进行判断是否返回403。
#当然上面的只是示例,比如还有做各种挑战的,rewrite啥的

常用变量:

$args:这个变量等于请求行中的参数,同$query_string
$request_filename:请求资源路劲 
$uri:不带请求参数的当前URI,$uri不包含主机名,如”/html/abc.html”
$host:请求主机头字段,否则为服务器名称。

Nginx大部分支持的变量:http://nginx.org/en/docs/varindex.html
 


http://chatgpt.dhexx.cn/article/YPyL94aa.shtml

相关文章

Nginx基础——Rewrite规则

点击上方“芋道源码”&#xff0c;选择“置顶公众号” 技术文章第一时间送达&#xff01; 源码精品专栏 精尽 Dubbo 原理与源码专栏( 已经完成 69 篇&#xff0c;预计总共 75 篇 )中文详细注释的开源项目Java 并发源码合集RocketMQ 源码合集Sharding-JDBC 源码解析合集Spring …

F280049C Crossbar X-BAR

文章目录 X-BAR9.1 输入X-BAR9.2 ePWM、CLB和GPIO输出X-BAR9.2.1 ePWM X-BAR9.2.1.1 ePWM X-BAR架构 9.2.2 CLB X-BAR9.2.2.1 CLB X-BAR架构 9.2.3 GPIO输出X-BAR9.2.3.1 GPIO输出X-BAR架构9.2.4 X-BAR标志 总结 X-BAR 交叉开关&#xff08;在本章中称为X-BAR&#xff09;提供…

BCGControlBar Pro 31.2 正式版-Key

什么是 MFC 的 BCGControlBar Pro&#xff1f; BCGControlBar&#xff08;“Business Components Gallery ControlBar”&#xff09;是一个 MFC 扩展库&#xff0c;企鹅180846090允许您创建具有完全自定义选项&#xff08;功能区、可自定义工具栏、菜单等&#xff09;和一组丰富…

BCGControlBar Library for .NET 7.1.1 Crack

什么是 BCGControlBar Library for .NET&#xff1f; BCGControlBar Library for .NET 是 100% 托管代码工具包&#xff0c;用 C/CLI 编写&#xff0c;面向 Microsoft .NET Framework 2.0 或更高版本。该库包含许多高度可定制、完全可设计的组件&#xff0c;使您能够创建最复杂…

BCGControlBar v12的向导使用图解

BCGControlBar专业版是MFC的一个扩展库&#xff0c;您可以用来构建类似于Microsoft Office 2000/XP/2003/2007/2010、Microsoft Visual Studio&#xff08;打印、用户定制工具栏、菜单等&#xff09;和其他一些知名产品的高级用户界面。 首先从网上下载BCGControlBar v12资源 &…

MFC界面控件BCGControlBar v33.4 - 日历、属性网格组件升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了&#xff0c;该版本包含了对Windows 11 Mica materi…

BCG学习(一)——BCGControlBar安装与配置

最近工作中需要用到BCG相关的知识&#xff0c;趁着全民防疫、居家隔离这段时间正好学习一下&#xff0c;作此笔记&#xff0c;记录学习过程和心得体会。话不多说&#xff0c;开整&#xff01; 简介 下载、安装与配置 例程编译与运行 简介 BCG是MFC的一个扩展库&#xff0c;可以…

MFC扩展库BCGControlBar Pro v33.5新版亮点 - 控件、脚本管理增强

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v33.5已正式发布了&#xff0c;此版本包含了Ribbon&#xff08;功能区&#xff09;自定义…

MFC界面控件BCGControlBar v33.4 - 支持Win 11 Mica material主题

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了&#xff0c;该版本包含了对Windows 11 Mica materi…

MFC界面控件BCGControlBar v33.4 - 各子控件全面升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.4已正式发布了&#xff0c;该版本包含了对Windows 11 Mica materi…

MFC界面控件BCGControlBar v33.3 - 升级Ribbon Bar自定义功能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 该版本包含了增强的Ribbon自定义、新的日期/时间数字指示器、带有文本对齐的组控件、多行支持以及其他一些新功…

MFC界面控件BCGControlBar v33.3 - 可视化管理器和主题更新

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.3已正式发布了&#xff0c;该版本包含了增强的Ribbon自定义、新的…

BCGControlBar使用说明

BCGControlBar使用说明 1.BCGControlBar简介1.1 概述1.2 开发环境1.3 安装 1.BCGControlBar简介 1.1 概述 BCG是MFC的一个扩展库&#xff0c;可以用来构建类似于Microsoft Office 2003/2007/2010/2013/2016 和 Microsoft Visual Studio-like&#xff08;打印、用户定制工具栏、…

【MySQL】物化视图

物化视图是相对于视图而言的&#xff0c;但是两者实际上并没有什么关系就如java/javaScript一样 首先mysql的视图不是一种物化视图&#xff0c;他相当于一个虚拟表&#xff0c;本身并不存储数据&#xff0c;当sql在操作视图时所有数据都是从其他表中查询出来的。者带来的问题是…

Oracle——物化视图

文章目录 含义物化视图的语法物化视图的创建1、自动刷新的物化视图 ON COMMIT2、非自动刷新的物化视图 ON demand 关于手动刷新物化视图的删除资料参考 含义 什么是物化视图&#xff1f; 物化视图&#xff0c;通俗点说就是物理化的视图。 什么叫物理化&#xff1f; 将视图以表…

PostgreSQL视图和物化视图

由于每天工作忙碌&#xff0c;好久没更新了&#xff0c;今天更新一下&#xff0c;讲一讲视图和物化视图的概念以及区别吧。 1. 视图 1.1 PostgreSQL视图概述 PostgreSQL中的视图和MySQL中的视图是一样的&#xff0c;在查询的时候进行扫描基础表的操作。 视图表示基础表对应的…

达梦物化视图的使用与管理

文章目录 前言一、关于物化视图所需的权限二、创建手动刷新物化视图1.测试环境构造2.创建手动刷新物化视图3.自动完全更新的物化视图4.自动快速更新的物化视图5.定时更新物化视图 三、物化视图的管理四、总结 前言 物化视图是从一个或几个基表导出的表&#xff0c;同视图相比&…

Oracle物化视图与物化视图日志

文章目录 物化视图物化视图与普通视图的区别创建一个存放person的表创建一个存放person的address的表初始化数据创建物化视图的语句1.build [immediate|deferred]2.refresh [fast|complete|force] 视图刷新的方式:3.MV数据刷新的时间&#xff1a;4.查询重写&#xff08;QueryRe…

【物化视图的创建和管理】

1物化视图 视图 (VIEW) 可以看做是一种逻辑表&#xff0c;其数据来自于一张表或多张表&#xff0c;不占用物理存储空间。对视图的 DML 操作本质上是对其基表的操作。物化视图和普通视图一样&#xff0c;都是构建在一个查询语句之上的&#xff0c;只是物化视图会存储并刷新视图中…

创建物化视图详解(图解)

创建物化视图详解 一&#xff0c;什么是物化视图 物化视图是包括一个查询结果的数据库对象&#xff0c;它是远程数据的的本地副本&#xff0c;或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据&#xff0c;也可以称为快照。 二&#xff0c;作用、 在类似统…