百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Nginx的Http请求11个阶段之rewrite阶段:如何灵活使用rewrite

wxin55 2024-11-13 13:23 12 浏览 0 评论

rewrite模块中如果执行了 return指令,那么后面的阶段都没有机会执行。

那么return指令的语法是怎么样的?

主要有3种:

return code [text]; 
return code URL; 
return URL;


444 这个状态码,浏览器是收不到这个code的。这是Nginx自定义的状态码。

表示Nginx立刻关闭连接,不再向用户返回任何内容。

/* Our own HTTP codes */ 
/* The special code to close connection without any response */ 
#define NGX_HTTP_CLOSE 444 
#define NGX_HTTP_NGINX_CODES 494 
#define NGX_HTTP_REQUEST_HEADER_TOO_LARGE 494 
#define NGX_HTTPS_CERT_ERROR 495 
#define NGX_HTTPS_NO_CERT 496


return指令与error_page

我们经常用看到Nginx配置中有error_page。

error_page的意思实际上是 当收到某一个返回码的时候,可以重定向为另外一个uri,也可以指定给用户返回不一样的内容。

可以出现的范围http,server, location, if

常见案例:404页面,找不到该页面的时候,我们想返回给用户一些用户体验较好的页面,比如寻找走失儿童或者保护环境等。



rewrite指令

语法:

rewrite regex replacement [flag];

作用:

1. 匹配上正则表达式regex的url 替换成replacement(新的url ) ,flag 是表示行为。

2. 当replacement以http:// 或 https://或 $schema开头,则直接返回302重定向

3. 替换后的url根据flag指定的方式进行处理

flag 的选项:

--last:用replacement这个新的URI 重新在我们的location中进行匹配。

--break: break指令停止当前脚本指令的执行。

--redirect:返回302重定向

--permanent:返回301重定向


为了巩固一下 我们来看一个例子:

html下有3个目录, 并放入3个文件。内容分别是 test1 test2 test3。

cd html mkdir first second third 
echo "test1" > html/first/1.txt 
echo "test2" > html/second/2.txt 
echo "test3" > html/third/3.txt


nginx.conf如下

server { 
  		server_name rewrite.local.com; 
        rewrite_log on; 
        error_log logs/rewrite_error.log notice; 
  			root html/; 
        location /first { 
          rewrite /first(.*) /second$1 last; 
          return 200 'first!\n'; 
        } 
  
        location /second { 
          rewrite /second(.*) /third$1; 
          return 200 'second!\n'; 
        }
  
		  	location /third { 
          return 200 'third!\n'; 
        } 
}

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

原因是因为

在匹配到/first的时候 被rewrite 成了second flag是last,就到上层去重新匹配了。

此时匹配到了第二个location /second,进来又被rewrite了,但是没有last,也没有break。于是继续执行return 200 'second!\n';

在第二个location里都已经return了。 第三个location就没有机会执行了。


那么我们再变化一下将第二个location变成以下

 location /second { 
   rewrite /second(.*) /third$1 last; 
   return 200 'second!\n'; 
 }

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

这个想必大家都知道结果了。最后被匹配到第三个location里了。


那么我们再变化一下将第二个location变成以下 区别一下break和 last的区别

location /second { 
  rewrite /second(.*) /third$1 break; 
  return 200 'second!\n'; 
}

此时 我们请求会返回什么呢?

curl return.local.com/first/3.txt

结果是

这是因为在location /second里被rewrite后,flag为break 就不执行下面的return; 也不返回重新匹配localtion 而是停止了 直接请求third/3.txt了。




好了,今天就先到这里了,明天我们继续学习http请求处理的 find_config阶段。

相关推荐

ES6中 Promise的使用场景?(es6promise用法例子)

一、介绍Promise,译为承诺,是异步编程的一种解决方案,比传统的解决方案(回调函数)更加合理和更加强大在以往我们如果处理多层异步操作,我们往往会像下面那样编写我们的代码doSomething(f...

JavaScript 对 Promise 并发的处理方法

Promise对象代表一个未来的值,它有三种状态:pending待定,这是Promise的初始状态,它可能成功,也可能失败,前途未卜fulfilled已完成,这是一种成功的状态,此时可以获取...

Promise的九大方法(promise的实例方法)

1、promise.resolv静态方法Promise.resolve(value)可以认为是newPromise方法的语法糖,比如Promise.resolve(42)可以认为是以下代码的语...

360前端一面~面试题解析(360前端开发面试题)

1.组件库按需加载怎么做的,具体打包配了什么-按需加载实现:借助打包工具(如Webpack的require.context或ES模块动态导入),在使用组件时才引入对应的代码。例如在V...

前端面试-Promise 的 finally 怎么实现的?如何在工作中使用?

Promise的finally方法是一个非常有用的工具,它无论Promise是成功(fulfilled)还是失败(rejected)都会执行,且不改变Promise的最终结果。它的实现原...

最简单手写Promise,30行代码理解Promise核心原理和发布订阅模式

看了全网手写Promise的,大部分对于新手还是比较难理解的,其中几个比较难的点:状态还未改变时通过发布订阅模式去收集事件实例化的时候通过调用构造函数里传出来的方法去修改类里面的状态,这个叫Re...

前端分享-Promise可以中途取消啦(promise可以取消吗)

传统Promise就像一台需要手动组装的设备,每次使用都要重新接线。而Promise.withResolvers的出现,相当于给开发者发了一个智能遥控器,可以随时随地控制异步操作。它解决了三大...

手写 Promise(手写输入法 中文)

前言都2020年了,Promise大家肯定都在用了,但是估计很多人对其原理还是一知半解,今天就让我们一起实现一个符合PromiseA+规范的Promise。附PromiseA+规范地址...

什么是 Promise.allSettled()!新手老手都要会?

Promise.allSettled()方法返回一个在所有给定的promise都已经fulfilled或rejected后的promise,并带有一个对象数组,每个对象表示对应的pr...

前端面试-关于Promise解析与高频面试题示范

Promise是啥,直接上图:Promise就是处理异步函数的API,它可以包裹一个异步函数,在异步函数完成时抛出完成状态,让代码结束远古时无限回掉的窘境。配合async/await语法糖,可...

宇宙厂:为什么前端离不开 Promise.withResolvers() ?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.为什么需要Promise.with...

Promise 新增了一个超实用的 API!

在JavaScript的世界里,Promise一直是处理异步操作的神器。而现在,随着ES2025的发布,Promise又迎来了一个超实用的新成员——Promise.try()!这个新方法简...

一次搞懂 Promise 异步处理(promise 异步顺序执行)

PromisePromise就像这个词的表面意识一样,表示一种承诺、许诺,会在后面给出一个结果,成功或者失败。现在已经成为了主流的异步编程的操作方式,写进了标准里面。状态Promise有且仅有...

Promise 核心机制详解(promise机制的实现原理)

一、Promise的核心状态机Promise本质上是一个状态机,其行为由内部状态严格管控。每个Promise实例在创建时处于Pending(等待)状态,此时异步操作尚未完成。当异步操作成功...

javascript——Promise(js实现promise)

1.PromiseES6开始支持,Promise对象用于一个异步操作的最终完成(包括成功和失败)及结果值的表示。简单说就是处理异步请求的。之所以叫Promise,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: