nginx http rewrite module 详解
大家好,我是 17。
今天和大家聊聊 nginx http rewrite module 。
简单来说, ngx_http_rewrite_module module 用正则匹配请求,改写请求,然后做跳转。可以是内部跳转,也可以是外部跳转。
学习这个模块的时候,把 rewrite_log 打开,可以在 error log 里查看跳转信息
rewrite_log on; error_log /home/log/test-error.log notice;
注意 notice 是必须的
顺序执行和循环跳转
- 直接写在 server level 的 指令,顺序执行。
- 写在 location 中的指定顺序执行。可以跳到其它 location ,最多不超过 10次。
server{rewrite ^/users/(.*)$ /show?user=$1 ;rewrite ^/teachers/(.*)$ /show?teacher=$1 ;
}
请求 /users/1 ,先执行第一条 rewrite ^/users/(.*)$ /show?user=$1
再执行第二条 rewrite ^/teachers/(.*)$ /show?teacher=$1 ; 虽然第一条匹配到了,还是会执行第二条。这就是顺序执行的意思。
location /{rewrite ^/teachers/(.*)$ /show/$1;rewrite ^/users/(.*) /show/$1;
}
location /show/{rewrite ^/show/(.*)$ /users/$1 ;
}
请求 /users/1,命中第一个location 。顺序执行第一个 rewrite,没命中,即使命中也会继续执行第二 rewrite ,命中。执行 rewirte 指令跳转到第二个location /show/,执行 rewirte 又回跳回 / ,这样循环10次,报 500 错误,查看 error 日志可以看到说明。
rewrite or internal redirection cycle while processing "/show/1"
这个过程演示了 location 中 rewrite 的执行逻辑。顺序执行,循环跳转。
rewrite module 中还有 5 个指令 break, if, return, rewrite, and set。
return
return 可以直接返回,打断后面的 rewrite module 指令的执行。
location / {return 409;rewrite ^/teachers/(.*)$ /show/$1;
}
执行 return 后,后面的指令就没有机会执行了。
return code [text];
return code URL;
return URL;
location /admin/{return 403 '没有访问权限';
}
location / {return 302 $scheme://www.baidu.com$request_uri;
}location /abc/{return 404;
}
set,break 比较简单,和其它语言差不多。下面着重讲下 rewirte 指令的 flag。
rewrite 指令的 flag
rewrite regex replacement [flag]
flag有四种
- last 停止执行后面的 ngx_http_rewrite_module 指令,并发起新的 location 匹配。
- break 停止执行后面的 ngx_http_rewrite_module 指令,然后没有后续了,不再发起 location 匹配。
- redirect 执行 302跳转,后面的指令不再执行。
- permanent 执行 301跳转,后面的指令不再执行。
last、break 停止执行的是 ngx_http_rewrite_module 指令,其它指令不受影响,还是会执行的。
regex 匹配的是路径部分
location / {rewrite ^/teacher/(.*)$ /show1/$1 last;rewrite ^/teacher/(.*) /show2/$1;
}
location /show1{return 900;
}
location /show2{return 901;
}curl http://localhost:3000/teacher/1
HTTP/1.1 900因为 last 会终止后面的 ngx_http_rewrite_module 指令,所以 第二句 rewrite ^/teacher/(.*) /show2/$1 不会执行。第一句执行完后,跳到 /show1,返回 900如果把 last 换成 break
HTTP/1.1 404因为 break 不再执行跳转,直接查找 show1/1 找不到,报 404.把 last 换成 redirect.
HTTP/1.1 302 浏览器会请求两次。把 last 换成 permanent.
HTTP/1.1 301 浏览器会请求两次。
如果 replacement 是 http开头,是可以直接跳转的
location / {rewrite ^/teacher/ http://juejin.cn
}curl http://localhost:3000/teacher/1
HTTP/1.1 302
Location: http://juejin.cn相当于 redirect 指令的效果。
if 语句
if 语句不复杂,但是非常有用,可以这样说,用 if 可以实现很多指令,但是用内置指令更简洁,还是要优先用指令。
if ($param) 如果 $param 为空字符串或 0 为假,其它情况为真。
注意 if 后面必须要有空格,否则报错。
set $param '0';
set $param 0;
set $param '';这三种写法 $param 都为假,其它情况都为真
用 = ,!=判断相等。
if ($request_method = POST){return 403;}
注意 是一个 = 不是两个=, 等号左右必须要有空格,否则报错
用正则表达式判断
~ 区分大小写
if ($http_user_agent ~ mobile)~* 不区分大小写
if ($http_referer ~* juejin\.cn)!~ 和 !~* 是对应的两个否定写法,不再举例了。
用 flag
-f !-f 文件是否存在
if (-f $request_filename)
if (!-f $request_filename)-d !-d 目录是否存在
-e !-e 文件或目录是否存在
-x !-e 是否可执行## url 美化
http rewrite 一个应用就是 url 美化。
我们在开发的时候用的 url 是这样的
/users?id=1
让别人访问的时候可能是这样的
/users/1
所以我们需要把 `/users/1` 转为 `/users?id=1` ,这时就需要 rewrite 出场了。
location /users/{
rewrite ^/users/(.*)$ /nodejs/id=$1? last;
}
location /nodejs/{
proxy_pass http://127.0.0.1:3000;
}
当请求`/users/1` 的时候,命中 location /users/ ,执行rewrite 指令, last flag 指示停止后面的rewrite 指令并做内部跳转,匹配到 location /nodejs/ ,经过 proxy_pass 指令,转到 /nodejs/ 。相关文章:
nginx http rewrite module 详解
大家好,我是 17。 今天和大家聊聊 nginx http rewrite module 。 简单来说, ngx_http_rewrite_module module 用正则匹配请求,改写请求,然后做跳转。可以是内部跳转,也可以是外部跳转。 学习这个模块的时候…...
机器学习可解释性一(LIME)
随着深度学习的发展,越来越多的模型诞生,并且在训练集和测试集上的表现甚至于高于人类,但是深度学习一直被认为是一个黑盒模型,我们通俗的认为,经过训练后,机器学习到了数据中的特征,进而可以正…...
CV学习笔记-MobileNet
MobileNet 文章目录MobileNet1. MobileNet概述2. 深度可分离卷积(depthwise separable convolution)2.1 深度可分离卷积通俗理解2.2 深度可分离卷积对于参数的优化3. MobileNet网络结构4. 代码实现4.1 卷积块4.2 深度可分离卷积块4.3 MobileNet定义4.4 完…...
C++进阶——继承
C进阶——继承 1.继承的概念及定义 面向对象三大特性:封装、继承、多态。 概念: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特 性的基础上进行扩展,增加功能,这…...
数据结构---单链表
专栏:数据结构 个人主页:HaiFan. 专栏简介:从零开始,数据结构!! 单链表前言顺序表的缺陷链表的概念以及结构链表接口实现打印链表中的元素SLTPrintphead->next!NULL和phead!NULL的区别开辟空间SLTNewNod…...
redis数据结构的底层实现
文章目录一.引言二.redis的特点三.Redis的数据结构a.字符串b.hashc.listd.sete.zset(有序集合)一.引言 redis是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value的NoSQL数据库。 通常使用redis作为缓存中间件来降低数据库的压力,除此…...
【JavaSE】复习(进阶)
文章目录1.final关键字2.常量3.抽象类3.1概括3.2 抽象方法4. 接口4.1 接口在开发中的作用4.2类型和类型之间的关系4.3抽象类和接口的区别5.包机制和import5.1 包机制5.2 import6.访问控制权限7.Object7.1 toString()7.2 equals()7.3 String类重写了toString和equals8.内部类8.1…...
Java 主流日志工具库
日志系统 java.util.logging (JUL) JDK1.4 开始,通过 java.util.logging 提供日志功能。虽然是官方自带的log lib,JUL的使用确不广泛。 JUL从JDK1.4 才开始加入(2002年),当时各种第三方log lib已经被广泛使用了JUL早期存在性能问题&#x…...
产品经理有必要考个 PMP吗?(含PMP资料)
现在基本上做产品的都有一个PMP证件,从结果导向来说,不对口不会有这么大范围的人来考,但是需要因地制宜,在公司内部里,标准程序并不流畅,产品和项目并不规范,关系错综复杂。 而产品经理的职能又…...
什么是原型、原型链?原型和原型链的作用
1、ES6之前,继承都用构造函数来实现;对象的继承,先申明一个对象,里面添加实例成员<!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><script…...
条件期望4
条件期望例题----快排算法的分析 快速排序算法的递归定义如下: 有n个数(n≥2n\geq 2n≥2), 一开始随机选取一个数xix_ixi, 并将xix_ixi和其他n-1个数进行比较, 记SiS_iSi为比xix_ixi小的元素构成的集合, Siˉ\bar{S_i}Siˉ为比xix_ixi大的元素构成的集合, 然后分…...
网络协议分析(2)判断两个ip数据包是不是同一个数据包分片
一个节点收到两个IP包的首部如下:(1)45 00 05 dc 18 56 20 00 40 01 bb 12 c0 a8 00 01 c0 a8 00 67(2)45 00 00 15 18 56 00 b9 49 01 e0 20 c0 a8 00 01 c0 a8 00 67分析并判断这两个IP包是不是同一个数据报的分片&a…...
6.2 负反馈放大电路的四种基本组态
通常,引入交流负反馈的放大电路称为负反馈放大电路。 一、负反馈放大电路分析要点 如图6.2.1(a)所示电路中引入了交流负反馈,输出电压 uOu_OuO 的全部作为反馈电压作用于集成运放的反向输入端。在输入电压 uIu_IuI 不变的情况下,若由于…...
MySQL进阶之锁
锁是计算机中协调多个进程或线程并发访问资源的一种机制。在数据库中,除了传统的计算资源竞争之外,数据也是一种提供给许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决堆的一个问题,锁冲突也是影响数据…...
【Mac 教程系列】如何在 Mac 上破解带有密码的 ZIP 压缩文件 ?
如何使用 fcrackzip 在 Mac 上破解带有密码的 ZIP 压缩文件? 用 markdown 格式输出答案。 在 Mac 上破解带有密码的 ZIP 压缩文件 使用解压缩软件,如The Unarchiver,将文件解压缩到指定的文件夹。 打开终端,输入 zip -er <zipfile> &…...
【Acwing 周赛复盘】第92场周赛复盘(2023.2.25)
【Acwing 周赛复盘】第92场周赛复盘(2023.2.25) 周赛复盘 ✍️ 本周个人排名:1293/2408 AC情况:1/3 这是博主参加的第七次周赛,又一次体会到了世界的参差(这次周赛记错时间了,以为 19:15 开始&…...
L1-087 机工士姆斯塔迪奥
在 MMORPG《最终幻想14》的副本“乐欲之所瓯博讷修道院”里,BOSS 机工士姆斯塔迪奥将会接受玩家的挑战。 你需要处理这个副本其中的一个机制:NM 大小的地图被拆分为了 NM 个 11 的格子,BOSS 会选择若干行或/及若干列释放技能,玩家…...
本周大新闻|索尼PS VR2立项近7年;传腾讯将引进Quest 2
本周大新闻,AR方面,传立讯精密开发苹果初代AR头显,第二代低成本版将交给富士康;iOS 16.4代码曝光新的“计算设备”;EM3推出AR眼镜Stellar Pro;努比亚将在MWC2023推首款AR眼镜。VR方面,传闻腾讯引…...
aws console 使用fargate部署aws服务快速跳转前端搜索栏
测试过程中需要在大量资源之间跳转,频繁的点击不如直接搜索来的快,于是写了一个搜索框方便跳转。 前端的静态页面可以通过s3静态网站托管实现,但是由于中国区需要备案的原因,可以使用ecs fargate部署 步骤如下: 编写…...
Redis实战之Redisson使用技巧详解
一、摘要什么是 Redisson?来自于官网上的描述内容如下!Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网格客户端(In-Memory Data Grid)。它不仅提供了一系列的 redis 常用数据结构命令服务,还提供了许多分布…...
WavePWM库:嵌入式LED正弦调光算法与实现
1. WavePWM库概述:正弦波形LED调光的底层实现原理与工程应用 WavePWM是一个面向嵌入式LED驱动场景的轻量级波形PWM计算库,其核心价值不在于直接控制硬件引脚,而在于 以确定性数学模型生成高保真度的正弦(或类正弦/指数࿰…...
避坑指南:Ollama部署DeepSeek-R1时,如何安全地开放API端口给内网其他服务调用?
深度解析:Ollama部署DeepSeek-R1时内网API安全开放实战 当你在一台Linux服务器上成功部署了Ollama和DeepSeek-R1模型后,下一步自然是想让内网中的其他服务也能调用这个强大的AI能力。但直接开放端口就像把家门钥匙插在锁上——方便但危险。本文将带你深入…...
告别云端推理:手把手教你用Vivado HLS在AX7350开发板上部署YOLOv3(附完整工程)
从零部署YOLOv3到AX7350开发板:FPGA加速实战全流程解析 在边缘计算领域,FPGA因其低延迟、高能效和可重构特性,成为深度学习模型部署的热门选择。本文将带您完成YOLOv3目标检测模型在AX7350开发板上的完整部署流程,从环境准备到最终…...
从零开始:如何用Python训练一个AI模型(超详细教程)
引言 人工智能(AI)——一个熟悉又神秘的词汇。我们常听说它可以生成诗歌、编写代码、创作艺术,甚至回答各种问题。然而,当你想亲手实现一个“AI 模型”时,却可能感到无从下手。这篇教程正是为你准备的,将带…...
SpringBoot+Vue员工绩效系统实战:从数据库设计到权限控制的完整避坑指南
SpringBootVue员工绩效系统实战:从数据库设计到权限控制的完整避坑指南 在数字化转型浪潮下,企业绩效管理系统正从传统的Excel表格升级为智能化平台。本文将带您从零构建一个具备多维度考核、动态权限控制和可视化分析的绩效系统,重点解决实际…...
AS_BH1750库:BH1750FVI环境光传感器嵌入式驱动设计与工程实践
1. AS_BH1750库概述:面向嵌入式系统的BH1750FVI环境光传感器驱动设计与工程实践BH1750FVI是由ROHM Semiconductor推出的高精度数字环境光传感器(Ambient Light Sensor, ALS),采用IC接口,具备宽动态范围(0.1…...
d-id AI studio会员值得买吗?实测3大核心功能与免费版对比
d-id AI studio会员深度评测:三大核心功能实测与免费版差异全解析 在数字内容创作领域,AI视频工具正掀起一场革命。作为行业新锐,d-id AI studio凭借其独特的面部动画技术,让普通用户也能轻松制作专业级动态视频。但对于已经体验…...
保姆级教程:在Ubuntu 20.04上搞定海思SS524/SS522 SDK编译与固件烧录
海思SS524/SS522开发实战:从零构建嵌入式Linux系统的完整指南 作为一名长期深耕嵌入式开发的工程师,我深知从零开始搭建一个完整的开发环境有多么令人头疼。特别是当你拿到一块全新的开发板,面对陌生的SDK和工具链时,那种既兴奋又…...
Atomics探究(四)-- atomic flag
本篇将研究atomic_flag相关函数底层汇编指令,以及与其他原子操作函数进行比较,探讨其存在的意义。 1、标准描述: 2、定义 gcc 头文件中定义如下 typedef _Atomic struct { #if __GCC_ATOMIC_TEST_AND_SET_TRUEVAL == 1_Bool __val; #elseunsigned char __val; #endif } at…...
终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统
终极指南:如何使用LeetDown轻松降级A6/A7苹果设备系统 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown LeetDown是一款专为macOS设计的图形化降级工具,能够…...
