Nginx系列--rewrite的使用

原文网址:Nginx系列--rewrite的使用_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Nginx中rewrite的使用。

语法

rewrite regex URL [flag];

flag标志位

  • last:停止处理rewrite,并对配更改后的 URI 重新进行搜索(再从 server 走一遍匹配流程)。此时对于当前 server 或 location 上下文,不再处理 rewrite 指令。
  • break:停止处理rewrite
    • last 和 break 的区别:last 重写 url 后,会再从 server 走一遍匹配流程,而 break 终止重写后的匹配
    • last 和 break 的相同点:都能停止处理,后面的 rewrite 指令不会再执行。
  • redirect:返回包含 302 代码的临时重定向,在替换字符串不以"http://","https://“或”$scheme"开头时使用.
  • permanent:返回包含 301 代码的永久重定向。
    • permanent 是永久重定向,浏览器会记住它,会一直重定向你设置的地址。可以通过清除浏览器缓存解决。

rewrite 指令只能返回代码 301 或 302。要返回其他代码,需要在 rewrite 指令后面包含 return 指令。

查看rewrite日志

打开日志开关:rewrite_log on; 可以配置到http,server,location和if上下文中。

示例

配置:nginx.conf

location /first {rewrite_log on;rewrite /first(.*) /second$1 last;
}

访问

curl test1.com:8080/first/2.txt 

日志结果 

示例:break和last

break

配置

server {listen 9000;server_name localhost;location /info {rewrite ^/.* https://www.baidu.com permanent;}location /break {rewrite /.* /info break;proxy_pass http://127.0.0.1:9000;# 该 return 不执行return 200 "ok";}
}

访问

http://localhost:9000

结果

重定向到了baidu.com

分析

首先,匹配到 /break 的 location 块,执行了 rewrite 和 proxy_pass,跳过 return(因为有 break),重定向到 http://127.0.0.1:9000/info;然后,再次进行 server 块,匹配到 /info 的 location 块,最后重定向到了baidu。

last

配置

server {listen 9000;server_name localhost;location /info {rewrite ^/.* https://www.baidu.com permanent;}location /break {rewrite /.* /info last;# 该 proxy_pass 不执行proxy_pass http://127.0.0.1:9000;# 该 return 不执行return 200 "ok";}
}

访问

http://localhost:9000

结果

重定向到了baidu.com

分析

首先,匹配到 /break 的 location 块,执行了 rewrite,跳过 return 和 proxy_pass(因为有 last,proxy_pass 需要和 break 一起用);然后继续匹配,匹配到 /info 的 location 块,最后重定向到了baidu。

示例:在location的内部和外部

break和last在location外部

基础示例

server{listen 80; server_name test.com;root /data/wwwroot/test.com;rewrite /1.html /2.html;rewrite /2.html /3.html;
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/3.html

分析:请求1.html文件时,会被重定向到2.html,然后被重定向到3.html,最后返回的文件为3.html

例1:rewrite后添加break

server{listen 80; server_name test.com;root /data/wwwroot/test.com;rewrite /1.html /2.html break;rewrite /2.html /3.html;
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。

例2:break后还有location

server{listen 80; server_name test.com;root /data/wwwroot/test.com;rewrite /1.html /2.html break;rewrite /2.html /3.html;location /2.html {return 403;}
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。

break和last在location内部

基础示例

server{listen 80; server_name test.com;root /data/wwwroot/test.com;location / {rewrite /1.html /2.html;rewrite /2.html /3.html;}location /2.html {rewrite /2.html /a.html;}location /3.html {rewrite /3.html /b.html;}
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/b.html

分析:请求1.html,会经过两次重定向到3.html,3.html又刚好匹配location /3.html{},所以返回b.html。

访问:test.com/2.html

结果:浏览器最终重定向到test.com/a.html

分析:请求2.html,会经过两次重定向到2.html,2.html又刚好匹配location /2.html{},所以返回a.html。

例1:rewrite后添加break

​
server{listen 80; server_name test.com;root /data/wwwroot/test.com;location / {rewrite /1.html /2.html break;rewrite /2.html /3.html;}location /2.html {rewrite /2.html /a.html;}location /3.html {rewrite /3.html /b.html;}
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/2.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,当前location{} 以及后面的location{} 的指令都不再执行。

例2:break后还有location

​
server{listen 80; server_name test.com;root /data/wwwroot/test.com;location / {rewrite /1.html /2.html last;rewrite /2.html /3.html;}location /2.html {rewrite /2.html /a.html;}location /3.html {rewrite /3.html /b.html;}
}

访问:test.com/1.html

结果:浏览器最终重定向到test.com/a.html

分析:请求1.html文件时,会被重定向到2.html,遇到break,不再执行下边的rewrite。2.html会再去匹配一次location,匹配到了location /2.html,于是返回了test.com/a.html。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 虚拟机 ubuntu 20.04 硬盘扩容方法

前言 最近由于需要编译 【RK3568】的 Linux SDK,发现 虚拟机默认的 200G 空间不足了,因此想增加这个 200G 空间的限制,通过网络上查找了一些方法,加上自己亲自验证,确认 硬盘扩容 正常,方法也比较的容易&a…

十五:爬虫-Scrapy-redis分布式

一:python操作redis 1.redis的安装与连接 安装 pip install redis 连接 r redis.StrictRedis(hostlocalhost,port6379,db0)2.redis数据类型相关操作 (1)字符串相关操作 import redis class TestString(object):# 初始化 连接redis数据库…

解决VMware 虚拟机 ubuntu 20.04 异常关闭导致虚拟网卡 ens33 无法工作问题

问题描述 由于经常使用 SSH 远程链接 VMware 中的虚拟机 ubuntu,每次关闭都是挂起,时间久了,虚拟机运行有些卡顿了,此时可以通过 Linux 命令重启或者关闭 ubuntu,也可以之间使用 VMWare 中的【虚拟机】-- 【电源】-&g…

HPM6750开发笔记《GPIO例程深度解析》

目录 创建工程: 代码分析: 1.头文件包含: 2.宏定义: 3.中断服务程序(ISR): 清除中断标志: 处理 LED 状态切换: 处理用户按键状态: 处理其他情况&…

WPF+Halcon 培训项目实战(11):HS组件封装

文章目录 前言相关链接项目专栏运行环境匹配图片封装组件新增类库项目选择依赖顺序并添加Nuget修改原本矩形方法运行结果: 对矩形进行抽象封装抽象基类矩形抽象改造 圆形抽象封装代码运行结果 前言 为了更好地去学习WPFHalcon,我决定去报个班学一下。原…

基于Rangenet Lib的自动驾驶LiDAR点云语义分割与可视化

这段代码是一个C程序,用于处理来自KITTI数据集的激光雷达(LiDAR)扫描数据。程序主要实现以下功能: 1. **读取和解析命令行参数**:使用Boost库中的program_options模块来定义和解析命令行参数。这包括扫描文件路径、模型…

计算机毕业设计 基于SSM的果蔬作物疾病防治系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

第二十七章 正则表达式

第二十七章 正则表达式 1.正则快速入门2.正则需求问题3.正则底层实现14.正则底层实现25.正则底层实现36.正则转义符7.正则字符匹配8.字符匹配案例19.字符匹配案例211.选择匹配符(|)12.正则限定符{n}{n,m}(1个或者多个)*(0个或者多…

介绍两本书《助推》与《耐力》

冠历最后一年已经养成了没有冲突的情况下每天跑步、读书的习惯,今天突发奇想:是否重新挑战下每日写作。 ​ 今天介绍两本书。第一本是《助推》,这本书是由于真友 吾真本 的介绍开始读的。 一句话介绍这本书,那就是:如果…

Hive08_分区表

一 分区表 1 概念: 分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询…

机器人制作开源方案 | 多地形适应野外探索智能车

1. 作品基本介绍 如今,智能机器人在军事、制造业、交通运输、航天航空、医疗、服务等领域已有广泛的应用,智能车是机器人研究领域的一项重要基础内容,在各种移动机构中,最为常见的是轮式移动方式,当今社会正处于科技高…

Linux 断言的使用

断言为我们提供了一种可以静态或动态地检查程序在目标平台上整体状态的能力,与它相关的接口由头文件 assert.h 提供