其实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), &regex);
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的更多相关文章

  1. nginx的脚本引擎(一)

    nginx的脚本的语法和shell是很像的,我大致看了一下觉得挺有意思的,就想写写记录一下.我没看过shell脚本的引擎,不知道nginx脚本引擎和shell脚本引擎像不像,但是我觉得nginx的脚本 ...

  2. C#脚本引擎 CS-Script 之(二)——性能评测

    以下以一个简单的HelloWord程序为例,来分析csscript脚本引擎的性能. class HelloWorld { public void SayHello() { Console.WriteL ...

  3. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  4. 利用Roslyn构建一个简单的C#交互脚本引擎

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 微软的下一代编译器技术Roslyn是一个里程碑的技术,可以给.NET平台带来无限想象空间.比 ...

  5. C#脚本引擎 CS-Script 之(三)——如何部署

    本文不但介绍了CS-Script如何部署,还介绍了CS-Script的部署后面的原理,并用一个框图详细介绍了部署中的各种细节. 一.获取资源 1.从官网上下载编译好的csscript资源:cs-scr ...

  6. C#脚本引擎 CS-Script 之(一)——初识

    最近在做新产品,这个产品需要满足不同项目对于系统的定制性数据处理需求,比如有的要统计一段时间内某开关打开关闭了多少次,有的要统计一段时间内空调的使用率,有的希望根据温度来控制空调的开还是关,有的则是希 ...

  7. Nmap脚本引擎原理

    Nmap脚本引擎原理 一.NSE介绍 虽然Nmap内嵌的服务于版本探测已足够强大,但是在某些情况下我们需要多伦次的交互才能够探测到服务器的信息,这时候就需要自己编写NSE插件实现这个功能.NSE插件能 ...

  8. nginx安装脚本

    #!/bin/bash#auto config Nginx#by zhangjia 2019#define Path variables#date:2019/1/16 check_ok() { ]] ...

  9. Nginx入门篇(二)之Nginx部署与配置文件解析

    一.Nginx编译安装 ()查看系统环境 [root@localhost tools]# cat /etc/redhat-release CentOS Linux release (Core) [ro ...

随机推荐

  1. 操作DOM对象

    操作DOM对象 目录 操作DOM对象 1. 核心 2. 获得Dom节点 3. 更新节点 1. 操作文本 2. 操作CSS 4. 删除节点 5. 插入节点 1. 追加(将已存在的节点移到后面) 2. 创 ...

  2. Tooltip鼠标hover放上时文字提示

    使用content属性来决定hover时的提示信息. 由placement属性决定展示效果: placement属性值为:                 方向-对齐位置: 四个方向:top.left ...

  3. (课堂笔记)第三章:F5 LTM 负载均衡理论

    BIG-IP LTM负载均衡理论 ------F5 BIG-IP LTM负载均衡策略---------- 1.1 LTM VS工作模式F5 BIG-IP LTM的内部对于数据包的处理方式,即是VS的工 ...

  4. UI中table写表格

  5. access数据库一般注入方法及偏移注入

    1.access数据库与mysql数据库的差别 access没有数据库,access数据库每个数据都是单个文件,每个access只有表结构 mysql : 库名,表名,列名,字段内容 access:表 ...

  6. Linux常用命令详解(2)

    aliasunaliasunamesuhostnamehistorywhichwcwwhowhoamipingkillseqdudffreedate 命令详解 1. alias 设置.’查看别名 实例 ...

  7. 重磅来袭 Vue 3.0 One Piece 正式发布

    代号为One Piece 的Vue3.0 在9月19日凌晨正式发布!! 此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更好的 TypeScript 支持. ...

  8. php Zookeeper使用踩坑

    用的是Zookeeper扩展,Php版本为7.2.17,下载地址: https://pecl.php.net/package/zookeeper 用的是0.6.4版本 创建节点官方给的示例如下: &l ...

  9. 出行即服务(MAAS)框架

    转自 出行即服务(MAAS)框架 一.概况 在共享交通模式和智能信息技术的基础之上,城市出现了全新的交通理念——“出行即服务(Mobility-as-a-Service,简称MaaS)”.MaaS将各 ...

  10. 5.CyclicBarrier-栅栏