Nginx-rewrite模块详解

文章目录

  • 前言
  • 一、ngx_http_rewrite_module模块
  • 二、指令详解
    • 1.break
      • 案例
    • 2. if指令
      • 案例
    • 3. return指令
      • 案例:
      • return 的优先级
    • 4. rewrite指令
      • 案例
    • 5. set指令
  • 总结


前言

nginx一些场景,我们需要使用rewrite模块。例如域名改了,为了利用网站seo进行伪静态处理。通过判断来实现一些逻辑处理等。这里我们介绍下ngx_http_rewrite_module模块


一、ngx_http_rewrite_module模块

ngx_http_rewrite_module模块官网传送门
ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI、返回重定向和有条件选择配置。

二、指令详解

1.break

用法示例:

Syntax:	break;
Default:	—
Context:	server, location, if

停止处理当前的ngx_http_rewrite_module指令集。
注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令,其它指令还会执行。

案例

配置

[root@private test]# cat rewritedemo.conf 
location /rewrite/break {set $name dog;echo $name;break;set $myport $server_port;  # set指令属于rewrite模块,break模块后不在执行; echo $myport;echo $name;
}

执行结果如下:

[root@private test]# curl http://nginx.test.io:8081/rewrite/break
dogdog

可以看出,

2. if指令

用法:

Syntax:	if (condition) { ... }
Default:	—
Context:	server, location

条件condition为真,则执行大括号内的指令;
Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断

  • 将变量和正则表达式做匹配 大小写敏感:~ 或者 !~ 大小写不敏感: ~*或者 !~*
  • 将变量和字符串做匹配,使用=或者 !=

案例

# 将变量和正则表达式做匹配if ($request_uri ~* ^/api/goods/delete) {set $del_flag 1;}# 将变量和字符串做匹配if ( $del_flag = 1) {set $flag "del";}# 判断传参
if ($args ~ userId=admin) {return 403 "该用户不允许修改";
}
# 判断客户端 
if ($http_user_agent ~ MSIE) {return 301 http://www.example.com/ie;
}

3. return指令

用法

Syntax:	return code [text];
return code URL;
return URL;
Default:	—
Context:	server, location, if

停止处理并将指定代码返回给客户端。非标准代码444关闭连接而不发送响应头。

案例:

# 自定义code,自定义返回文字
location / {
default_type application/json;
return 999 realip:$clientRealIp\r\nremoteaddr:$http_x_forwarded_for\r\naddr:$remote_addr;
# return 301 302 重定向
}

return 的优先级

下面的案例中,我们在location最后,return 401。 当我们访问nginx的时候,结果应该是返回多少呢?

server {server_name nginx.test.io;listen 8081;access_log off;default_type text/plain;location ~ /api/$ {return 200 'first regular expressions match!\n';}location ~* /api/(\w+)$ {return 200 'longest regular expressions match!\n';}			         location ^~ /api/ {return 200 'stop regular expression match!\n';}location /api/test {return 200 'logest prefix string match !\n';}location /api {return 200 'prefix string match!\n';}location = /api {return 200 'exact match!\n';}include test/rewritedemo.conf;   return 401;
}

在Nginx-HTTP请求的11个阶段文章中,我们了解到,nginx处理阶段中有出现了两次rewrite模块,NGX_HTTP_SERVER_REWRITE_PHASE和NGX_HTTP_REWRITE_PHASE,NGX_HTTP_SERVER_REWRITE_PHASE要在前,所以,上面案例中return 401; 在server块中要先一步执行返回,我们可以验证下。

[root@pri test]# curl http://nginx.test.io:8081/api/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@pri test]# curl http://nginx.test.io:8081
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>
[root@pri test]# curl http://nginx.test.io:8081/
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>

4. rewrite指令

用法

Syntax:	rewrite regex replacement [flag];
Default:	—
Context:	server, location, if
  • 将regex指定的url替换成replacement这个新的url (可以使用正则表达式以及变量提取)
  • 当replacement以http://或者https://或者$schema开头,则直接返回302重定向
  • 替换后的url根据flag指定的方式进行处理。
    – last: 用replacement这个URL进行新的location匹配 (stops processing the current set of ngx_http_rewrite_module directives and starts a search for a new location matching the changed URI;)
    – break: break指令停止当前脚本指令的执行,等价于独立的break指令。(stops processing the current set of ngx_http_rewrite_module directives as with the break directive;)
    – redirect: 返回302重定向
    – permanent: 返回301重定向

案例

#  假设你有一个动态的新闻页面地址,例如:http://example.com/news.php?id=123,你想将其伪静态为:http://example.com/news/123.html。
#  你需要在Nginx配置文件中的server块中添加以下规则:location ~ ^/news/([0-9]+)\.html$ {rewrite ^/news/([0-9]+)\.html$ /news.php?id=$1 last;}

5. set指令

set 指令已经出现在上面一些案例中了,这里不用过多解释了。


总结

rewrite模块在nginxHTTP处理阶段中出现了两次,需要注意先后顺序,rewrite模块的使用场景还是比较丰富的,我们会陆续补充。

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

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

相关文章

什么是YUV和IPB,PTS和DTS,视频编码解码过程

YUV 是一种在视频处理和压缩中常用的颜色空间。 它将图像的亮度 (Y) 与色度 (U 和 V) 成分分开。 这种分离对视频压缩和广播非常有益&#xff0c; 因为人眼对亮度变化比对颜色变化更敏感。 YUV 组件简介 Y (亮度)&#xff1a;表示图像的亮度或灰度信息。U (色度)&#xff1a;…

git - 变基、合并、重置后的回退操作

介绍 ORIG_HEAD 是 Git 中一个特殊的引用&#xff0c;用来指向某些操作&#xff08;如合并、变基、重置等&#xff09;前的状态。它可以用来快速恢复到这些操作之前的状态。下面是 ORIG_HEAD 的用法和一些常见的使用场景&#xff1a; 用法 1. 查看 ORIG_HEAD 使用以下命令查…

程序员需要具备的核心竞争力

随着IT人才的饱和&#xff0c;互联网就业形势越严峻。 作为一名工程师&#xff0c;需要具备哪些基本素养与能力&#xff0c;才能够应对这样的就业环境&#xff1f; 按照优先级排序如下&#xff1a; 1 业务理解、需求沟通能力 业务理解与需求沟通看似是技术经理、架构师需要…

四模卫星导航模块-高精度多模卫星定位技术

GPS02-UBX模块是思为无线基于u-blox最新款IC M10系列研发的一款全球卫星系统定位GPS/北斗模块。它可以支持BDS/GPS/GLONASS/Galileo四模定位(四选三&#xff0c;BDS和GLONASS不能同时使用)。GPS02-UBX模块能看到更多的卫星&#xff0c;有着更高的灵敏度&#xff0c;从而为用户获…

大模型日报 2024-07-04

大模型日报 2024-07-04 一、大模型资讯 大厂高管转战 AI 创业盘点&#xff1a;超 25 人&#xff0c;覆盖全产业链&#xff0c;AI 应用最热门 涉及多家互联网大厂高管加入生成式 AI 创业&#xff0c;涵盖多个领域及融资情况。 腾讯云发布自研大数据高性能计算引擎 Meson 软硬一体…

Linux脚本自动安装 docker

使用官方安装脚本自动安装 需使用 root 或sudu 权限账户安装 安装命令如下&#xff1a; curl -fsSL https://test.docker.com -o install-docker.shsudo sh install-docker.sh脚本中指令: –version 安装指定版本 Use the --version option to install a specific version, f…

浅谈chrome引擎

Chrome引擎主要包括其浏览器内核Blink、JavaScript引擎V8以及其渲染、网络、安全等子系统。下面我将对这些关键部分进行简要说明分析 1. Blink浏览器内核 Blink是Google开发的浏览器排版引擎&#xff0c;自Chrome 28版本起替代了Webkit作为Chrome的渲染引擎。Blink基于Webkit…

模余数最大公倍数

模余数最大公倍数 模余数题&#xff1a; 模余数 如果a%mb,则(am*k)%b。对m求模&#xff0c;余数为b的整数bm*k 题&#xff1a; 若干人&#xff0c;3001人为一排&#xff0c;余1人 4001人为一排&#xff0c;余2人 4999人为一排&#xff0c;余3人 求人数的最小值。 #include &l…

【Unity学习笔记】A*寻路算法

文章目录 图寻路算法BFS广度优先算法DFS深度优先贪心算法 引入权重Dijkstra算法 A*算法C#实现步骤 Unity中的A*算法A*优化建议 图 图的知识盘点 pathfinding 作为一名计算机专业的学生&#xff0c;对于图这种数据结构也是烂熟于心了。图是一种包含了多个结点的数据结构&…

案例分享:数据集市搭建方案中集成SQLFlow数据血缘分析工具

本文中描述的数据集市搭建方案是一家跨国公司在AWS平台上的具体实践案例。我公司参与其中的数据血缘部分的建设&#xff0c;SQLFlow数据血缘分析工具在该方案中帮助用户实现了数据血缘分析。 用户使用Redshift 数据库仓库进行数据集市开发。从各种数据源提取数据&#xff0c;并…

动态代理(通俗易懂)

程序为什么需要代理&#xff1f;代理长什么样&#xff1f; 例子 梳理 代理对象(接口)&#xff1a;要包含被代理的对象的方法 ---Star 被代理对象&#xff1a;要实现代理对象(接口) ---SuperStar 代理工具类&#xff1a;创建一个代理&#xff0c;返回值用代理对象&#xff0c…

罗克韦尔 AB 1756-OA16控制器 模块 处理器

罗克韦尔 AB 1756-OA16该模块是任何自动化系统的重要组成部分&#xff0c;提供对各种过程的精确控制。它被设计为易于安装和使用&#xff0c;具有用户友好的界面&#xff0c;允许简单的配置和监控。 罗克韦尔 AB 1756-OA16控制器是一款为工业应用而设计的先进控制系统。它具有…

React快速入门-跟着AI学习react

React的快速入门可以遵循以下步骤进行&#xff0c;我将结合参考文章中的相关信息&#xff0c;以分点表示和归纳的形式给出详细步骤&#xff1a; 一、React基础知识了解 React的概念和特点&#xff1a; React是一个专注于构建用户界面的JavaScript库&#xff0c;采用声明式设计…

python将多个文件夹里面的文件拷贝到一个文件夹中

网上可以搜到很多方式&#xff0c;有的好使&#xff0c;有的不好使&#xff0c;亲测如下脚本可用&#xff0c;并可达到我想要的效果&#xff0c;只将多个文件夹里的文件拷贝到一个文件夹中&#xff0c;不拷贝文件夹本身&#xff0c;如果需要文件夹也拷贝打开注释行即可 import…

初次使用GitHub教程入门

注册一个github账户 访问地址&#xff1a;https://github.com/&#xff0c;点击右上角sign up&#xff0c;录入以下信息&#xff0c;邮箱&#xff0c;密码&#xff0c;账号&#xff0c;会有邮箱验证&#xff0c;跟着步骤来就好了 配置 本机上设置你的github的邮箱和用户名 …

51-5 权限维持2 - 影子账号(隐藏用户)

权限维持技术 权限维持技术(Persistence,也称为权限持久化)是一种能够在系统重启、用户更改密码或其他可能导致访问中断的情况下保持对系统访问的技术。例如,它包括创建系统服务、利用计划任务、修改系统启动项或注册表、以及映像劫持等方法。 创建影子账户 影子账户是指隐…

【管理咨询宝藏139】某大型快消集团公司多渠道销售管理体系方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏139】某大型快消集团公司多渠道销售管理体系方案 【格式】PDF版本 【关键词】罗兰贝格、营销咨询、战略规划 【核心观点】 - 销售体系建设主要需…

谷粒商城学习-06-使用vagrant快速创建linux虚拟机

这一节的内容是在Windows上安装虚拟机。 为什么要按照虚拟机呢&#xff1f; 原因是很多软件只能在Linux下运行&#xff0c;有的虽然也可以在Windows上运行&#xff0c;但从安装到运行会遇到很多问题&#xff0c;为这些解决这些问题花时间对于大多数人特别是初学者是没有什么价…

数字人直播源码开发全攻略揭秘:如何搭建自己的数字人直播平台?

当前&#xff0c;数字人直播逐渐成为众多中小型企业线上带货和品牌宣传的不二之选&#xff0c;而艾媒研究数据也显示&#xff0c;超五成以上的被调查群体的企业使用过虚拟人技术&#xff0c;超三成被调查群体的企业计划使用虚拟人技术。在此背景下&#xff0c;越来越多的创业者…

android应用的持续构建CI(一)-- 总体设计

一、背景 接下里我希望通过一系列的文章&#xff0c;把android应用的构建梳理一遍&#xff0c;从总体设计到逐个环节的实现。 总体设计jenkins集成手动签名依赖环境应用管理 二、构建流程图 三、技术组件 jenkinsjdkgradle360加固 既然是android应用的持续构建&#xff0c…