nginx的脚本引擎(二)rewrite
其实rewrite指令和上一篇说的if/set/return/break之类的没多大差别,但是rewrite用起来相对复杂,我就把他单独放到了这里。想要弄懂nginx的脚本引擎需要先明白处理request的十一个处理阶段,不懂的话先去搜一下看看,网上很多。先说一下rewrite的用法吧。
rewrite regex replacement [flag];
regex:用来匹配uri的正则表达式。
replacement:匹配成功后用这个字段替换请求的uri。
上面这两个没什么可说的,简单明白,看一下flag,flag可以取的值如下:
last:当前指令执行完之后不在执行之后的指令,如果是在location块里这个请求会重新回到NGX_HTTP_FIND_CONFIG_PHASE阶段用新的uri寻找新location。
break:当前指令执行完之后不在执行之后的指令。
redirect:返回302重定向。
permanent 返回301重定向。
redirect和permanent比较简单,就不用说了,主要是区分last和break,这两个指令用在server块里没什么区别,但是用在location块里就要注意了,下面这个配置是我把官方文档上的例子拿过来改的。
location /download/ {
rewrite ^(/download/)(.*)\..*$ $1/mp3/$2.mp3 break;
rewrite ^(/download/)(.*)\..*$ $1/mp3/$2.ra break;
return 403;
}
如果把break换成last,并且匹配上了这条指令修改uri之后,请求会重新回到NGX_HTTP_FIND_CONFIG_PHASE阶段,因为uri的前缀没变会继续匹配到这个location,再执行rewrite,造成死循环,最终返回500错误。
我觉得官方文档上的例子并不会造成500错误,是我理解的不对还是他举的例子不对?传送门http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
这几个标志都会执行如下的代码,结束当前的脚本。
if (last) {
code = ngx_http_script_add_code(lcf->codes, sizeof(uintptr_t), ®ex);
if (code == NULL) {
return NGX_CONF_ERROR;
}
*code = NULL;
}
不同的是break的情况,break会额外执行如下的代码
if (code->uri) {
r->internal = 1;
r->valid_unparsed_uri = 0;
if (code->break_cycle) {
r->valid_location = 0;
r->uri_changed = 0;
} else {
r->uri_changed = 1;
}
}
把r->uri_changed置位,到了NGX_HTTP_POST_REWRITE_PHASE会检查这个标志,如果不为0就会跳回NGX_HTTP_FIND_CONFIG_PHASE阶段,这就是break标志和last标志的不同。
nginx的脚本引擎(二)rewrite的更多相关文章
- nginx的脚本引擎(一)
nginx的脚本的语法和shell是很像的,我大致看了一下觉得挺有意思的,就想写写记录一下.我没看过shell脚本的引擎,不知道nginx脚本引擎和shell脚本引擎像不像,但是我觉得nginx的脚本 ...
- C#脚本引擎 CS-Script 之(二)——性能评测
以下以一个简单的HelloWord程序为例,来分析csscript脚本引擎的性能. class HelloWorld { public void SayHello() { Console.WriteL ...
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- 利用Roslyn构建一个简单的C#交互脚本引擎
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 微软的下一代编译器技术Roslyn是一个里程碑的技术,可以给.NET平台带来无限想象空间.比 ...
- C#脚本引擎 CS-Script 之(三)——如何部署
本文不但介绍了CS-Script如何部署,还介绍了CS-Script的部署后面的原理,并用一个框图详细介绍了部署中的各种细节. 一.获取资源 1.从官网上下载编译好的csscript资源:cs-scr ...
- C#脚本引擎 CS-Script 之(一)——初识
最近在做新产品,这个产品需要满足不同项目对于系统的定制性数据处理需求,比如有的要统计一段时间内某开关打开关闭了多少次,有的要统计一段时间内空调的使用率,有的希望根据温度来控制空调的开还是关,有的则是希 ...
- Nmap脚本引擎原理
Nmap脚本引擎原理 一.NSE介绍 虽然Nmap内嵌的服务于版本探测已足够强大,但是在某些情况下我们需要多伦次的交互才能够探测到服务器的信息,这时候就需要自己编写NSE插件实现这个功能.NSE插件能 ...
- nginx安装脚本
#!/bin/bash#auto config Nginx#by zhangjia 2019#define Path variables#date:2019/1/16 check_ok() { ]] ...
- Nginx入门篇(二)之Nginx部署与配置文件解析
一.Nginx编译安装 ()查看系统环境 [root@localhost tools]# cat /etc/redhat-release CentOS Linux release (Core) [ro ...
随机推荐
- C# aspx 禁止文本款输入缓的几种方法
1 在ASP.NET中可以在页面中加入以下内容: <%@ OutputCache Location="None" VaryByParam="None" ...
- 原生javaScript导出表格数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Oracle数据库访问客户端 sqldeveloper-19.2.1.247.2212-x64 下载
Oracle数据库访问客户端 sqldeveloper-19.2.1.247.2212-x64 地址:https://pan.baidu.com/s/1iojCVxwXocyM8oObTf0xaw 这 ...
- about blog
前言 今天无意中发现了一个小姐姐自己设计的的博客,感觉非常的nice,就随手copy一下,完了感觉效果还蛮好的 end 附上小姐姐的博客以及教程
- iTextSharp生成PDF文件
这是一篇简单的教程,所以只涉及一些iTextSharp生成pdf的简单应用,详细教程请搜索iTextSharp进入官网看官方文档(英文版). iTextSharp官方文档:https://itextp ...
- Python3 学习笔记之 运算符
- linux如何把普通用户添加到sudo组
sudo原理:运行命令时,系统检查/etc/sudoers 配置文件,看这个用户是否有执行sudo的权限,如果有权限,系统要求输入用户自己的密码,如果密码输入正确,系统会以root身份运行 passw ...
- [二叉树-根到叶的子路径]路径总和 III (两层递归)
题目437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值. 找出路径和等于给定数值的路径总数. 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父 ...
- C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位
概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...
- 【机器学习】梯度下降 II
Gradient Descent 梯度下降 II 关于 Gradient Descent 的直观解释,参考上一篇博客[机器学习]梯度下降 I 本模块介绍几种梯度下降模型.定义符号标记如下: \(\th ...