其实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. 剑指 Offer 19. 正则表达式匹配

    题目描述 请实现一个函数用来匹配包含'. '和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字符匹配整个模式. ...

  2. python3之range()

    python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法(左闭右开) Python3 range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以 ...

  3. FFmpeg开发笔记(三):ffmpeg介绍、windows编译以及开发环境搭建

    前言   本篇章是对之前windows环境的补充,之前windows的是无需进行编译的,此篇使用源码进行编译,版本就使用3.4.8.   FFmpeg简介   FFmpeg是领先的多媒体框架,能够解码 ...

  4. XXE外部实体注入漏洞

    XML被设计为传输和存储数据,XML文档结构包括XML声明.DTD文档类型定义(可选).文档元素,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具.XXE漏洞全称XML E ...

  5. sql注入--bool盲注,时间盲注

    盲注定义: 有时目标存在注入,但在页面上没有任何回显,此时,我们需要利用一些方法进行判断或者尝试得到数据,这个过程称之为盲注. 布尔盲注: 布尔盲注只有true跟false,也就是说它根据你的注入信息 ...

  6. pytest文档1-pytest+Allure+jenkins+邮箱发送

    前言: 1.pytest+allure是目前很多公司使用较多的一种报告样式,因为它更详细,各种指标更直观(简单的说就是看着更高大上,更能装X). 环境准备: 1.Windows10 2.Allure ...

  7. spring boot之Thymeleaf

    没怎么仔细研究,就是spring boot的服务器需要一个登录界面,用这个实现了一个白板式的页面. https://blog.csdn.net/yelllowcong/article/details/ ...

  8. Vue 3.0 来了,我们该做些什么?

    靓仔路过,不要错过 想必 Vue3.0 发布这件事,大家都知道了. 我也是从朋友圈的转发得知此事,博客平台.公众号.朋友圈基本都有这么一条新闻,可见 Vue3.0 的被期待程度,因为 React 16 ...

  9. Orchard Core创建CMS/Blog站点

    安装.NET Core SDK 下载并安装当前最新版本.NET Core SDK 3.1: https://dotnet.microsoft.com/download 安装visual studio ...

  10. CMake 常用命令

    cmake是现在主流的用于多平台C++构建系统,本文用来记录cmake的一些常用命令的索引,加上一些自己理解,理解有误的话,欢迎大家指出. 常用路径 CMAKE_SOURCE_DIR: 顶级cmake ...