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

Nginx location 路由详解,多了解点

wxin55 2024-11-13 13:21 11 浏览 0 评论

路由--Location的使用


语法规则: location [=|~|~*|^~] /uri/ {… }

首先匹配 =,其次匹配^~,其次是按文件中顺序的正则匹配,最后是交给 /通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。




  1. =精准匹配命中时,停止 location 动作,直接走精准匹配,
  2. 一般匹配(含非正则)命中时,先收集所有的普通匹配,最后对比出最长的那一条
  3. 如果最长的那一条普通匹配声明为非正则,直接此条匹配,停止 location
  4. 如果最长的那一条普通匹配不是非正则,继续往下走正则 location
  5. 按代码顺序执行正则匹配,当第一条正则 location 命中时,停止 location

path匹配过程

假设 http 请求路径为

http://192.168.0.132:8088/mvc/index?id=2 ,匹配过程如下:

? 将整个 url 拆解为域名/端口/path/params

? 先由域名/端口,对应到目标 server 虚拟主机

? path 部分参与 location 匹配,path = path1 匹配部分 + path2 剩余部分

? 进入 location 方法体内部流程。

? 若是静态文件处理,则进入目标目录查找文件:root 指令时找 path1+path2 对应的文

件;alias 指令时找 path2 对应的文件

? 若是 proxy 代理,则形如 proxy_pass=ip:port 时转发 path1+path2 路径到 tomcat;形如

proxy_pass=ip:port/xxx 时 转 发 path2 路 径 到 tomcat 。 params 始 终 跟 随 转 发 。


rewrite 使用

rewrite regex replacement [flag];

flag= 【break/last/redirect/permanent 】

? regex 是正则表达式

? replacement 是替换值,新值

? flag -- 后续处理标识

flag=break

发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令会中断。原控制流程逻辑不变往下走

flag=last

发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令会中断。控制流程刷新,重新进行整个 location 层的逻辑流程。

flag= redirect/permanent

发生页面重定向(301 永久重定向/302 临时重定向),nginx 流程结束,返回 http 响应到浏览器,页面 url 更新

flag 为空

发生 nginx 内部重定向,path 值被更新,rewrite 层面的命令继续。最后一个 rewrite 完毕,刷新控制流程,重新进行 location 重匹配

Nginx 处理请求的 11 个阶段


Nginx 处理请求的全过程一共划分为 11 个阶段(如图),按阶段由上到下依次执行 (上

一阶段的所有指令执行完毕,才进入下一阶段)

各阶段的含义如下:

? post-read: 接收到完整的 http 头部后处理的阶段,在 uri 重写之前。一般跳过

? server-rewrite: location 匹配前,修改 uri 的阶段,用于重定向,location 块外的重写指令

( 多次执行)

? find-config: uri 寻找匹配的 location 块配置项( 多次执行)

? rewrite: 找到 location 块后再修改 uri,location 级别的 uri 重写阶段( 多次执行)

? post-rewrite: 防死循环,跳转到对应阶段

? preaccess: 权限预处理

? access: 判断是否允许这个请求进入

? post-access: 向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝

? try-files: 访问静态文件资源

? content : 内容生成阶段,该阶段产生响应,并发送到客户端

? log: 记录访问日志

相关推荐

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,就是我承诺,如果成功则怎么处理,失败怎...

取消回复欢迎 发表评论: