rewrite 指令

  • new,2022-06-07,chenxizhan1995@163.com

Module ngx_http_rewrite_module

该指令是 ngx_http_rewrite_module 模块提供的。

ngx_http_rewrite_module 模块

这个模块有七个指令。

  • break
  • if
  • return
  • rewrite
  • rewrite_log
  • set
  • uninitialized_variable_warn

该模块的用处是改写请求URI,实现这一目的使用的手段包括:PCRE、重定向、if 判断。

指令执行流程

该模块的 break if return rewrite set 指令按如下规则执行

  1. 依次执行 server 块内的 ngx_http_rewrite_module 模块的指令
  2. 循环
    该模块的 break if return rewrite set 指令按如下规则执行
  3. 依次执行 server 块内的 ngx_http_rewrite_module 模块的指令
  4. 循环
    1. 根据 URI 寻找匹配的 location
    2. 顺序执行 location 块内的 ngx_http_rewrite_module 模块的指令
    3. 若有 rewrite 指令,重复循环,但最多不超过 10 次。若需要第11次循环,则返回错误

break 指令

Syntax:  break;
Default:    —
Context:    server, location, if

Stops processing the current set of ngx_http_rewrite_module directives.

PS:只是终止 http_rewrite 指令的执行,其它模块的指令继续处理。

if 略读

Syntax:  if (condition) { ... }
Default:    —
Context:    server, location

return

Syntax:return code [text];return code URL;return URL;
Default:    —
Context:    server, location, if

Stops processing and returns the specified code to a client.

根据文档

  1. return URL; 等价于 return 302 URL
  2. return code URL; 限定 code 为 302,303,307,308 之一
  3. return code [text]; 限定 code 为除 302,303,307,308 之外的

rewrite

Syntax:  rewrite regex replacement [flag];
Default:    —
Context:    server, location, if

若 uri 与 rewrite 指令的 regex 匹配,则把它替换成 replacement。
无 flag 时,会顺序执行 rewreite 指令,设置了 flag 则根据其指示执行。
当 replacement 的开头是 http:// https:// 或者 $sheme:// 之一时,结束处理并直接返回客户端重定向。\

flag 有如下四种

  • break 终止 http_rewrite 模块指令的执行,继续执行其它模块的指令。
  • last 终止 http_rewrite 模块指令的执行,用改写后的 URI 重新匹配 location。
  • redirect 把 replacement 以 302 形式返回给客户端。当 replacement 的开头不是 http:// https:// 或者 $sheme:// 之一时,可以这样做。
  • permanent 返回 301 永久重定向

关于 break 和 last 标志,大概的逻辑如下:

execute directvie in server;labelA:
for (int i = 0; i< 10; i++){location loc = search_location(uri);for each directive in loc; doswitch (directive){case "break": break labelA;case "rewrite":if (flag == NULL) continue;if (flag == "last") continue labelA;if (flag == "break") break labelA;...}done
}

就是说,有这么一个最外层循环 labelA,它根据 uri 搜索 location,然后顺序执行其中的 http_rewrite 模块的指令,
遇到 break 指令,就终止整个循环;遇到 rewrite … break; 也终止整个循环,遇到 rewrite … last 则跳过本轮循环。

break 好比 for 循环的 break,结束的是整个 http_write 模块,
last 相当于 for 循环的 continue,结束的是 http_write 模块的本次循环,之后会重新匹配 location

rewrite 指令示例

server {listen 80;rewrite_log on;root /usr/share/nginx/html;location /hello {rewrite ^/hello$ /hello2 last;}location /hello2 {return 200 "$time_iso8601\n";}
}

如此配置,当访问 /hello 时,指令 rewrite ^/hello$ /hello2 last; 会把请求变为 /hello 然后重新
寻找 location,于是匹配到 /hello2。
如果 /hello 对应的 location 的指令改为 rewrite ^/hello$ /hello2 break;,则当访问 /hello 时,会把请求
重写为 /hello2,然后没有机会重新寻找 location 了,直接在 /hello 这个 location 中处理该请求,由于没有任何
配置,会寻找静态资源文件 /usr/share/nginx/html/hello2,当然找不到,会报 404错误。

示例配置

demo-nginx/demo2

nginx的http_rewrite模块的rewrite指令相关推荐

  1. Nginx极客时间:rewrite阶段的rewrite模块:return指令

    1. rewrite模块的return指令: return指令 是由 rewrite模块提供的 一个非常常用的指令,可以在 SERVER_REWRITE 和 REWRITE 这两个阶段生效, 它可以帮 ...

  2. Nginx中的rewrite指令(break,last,redirect,permanent)

    转载自:Nginx中的rewrite指令(break,last,redirect,permanent) rewite 在server块下,会优先执行rewrite部分,然后才会去匹配location块 ...

  3. Nginx的rewrite之rewrite指令

    rewrite指令 该指令通过正则表达式的使用来改变URI.可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理. URL和URI的区别: URI:统一资源标识符 URL:统一资源定位符 ...

  4. Nginx源码研究之nginx限流模块详解

    这篇文章主要介绍了Nginx源码研究之nginx限流模块详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 高并发系统有三把利器:缓存.降级和限流: 限流的目的是通过对并 ...

  5. Nginx使用之location和rewrite用法

    Nginx使用之location和rewrite用法 一.常见的Nginx正则表达式 二.location 1.location大致可以分为三类 2.location常用的匹配规则 3.locatio ...

  6. Nginx 附录C 模块编译,调试与测试

    Nginx 附录C 模块编译,调试与测试 C.1 编译与安装 环境要求 操作系统:目前Nginx各版本在以下操作系统和平台测试通过: FreeBSD 3 - 10 / i386; FreeBSD 5 ...

  7. Nginx的location匹配与rewrite重写跳转

    目录 Nginx的location匹配与rewrite重写跳转 一.常用的Nginx正则表达式 二.location 分类 location常用的匹配规则 优先级 location示例说明 Rewri ...

  8. 第1章 安装Nginx及第三方模块

    第1章 安装Nginx及第三方模块 标签: 精通Nginx 精通Nginx – 个人笔记 Nginx中文文档 阅读 开源软件架构:Nginx 第1章 安装Nginx及第三方模块 C10K问题 使用包管 ...

  9. Nginx的下载安装及其配置指令

    文章目录 一.Nginx的应用概述 1.Nginx概述 2.Nginx四大应用场景 1.HTTP服务器 2.反向代理 3.负载均衡 4.动静分离 二.Nginx的下载安装及其配置指令 1.环境准备 2 ...

最新文章

  1. yahoo註冊.com 域名1.99$/年
  2. Maven学习总结(8)——使用Maven构建多模块项目
  3. nacos作注册中心+feign接口调用进行服务提供和服务消费代码示例
  4. 前端学习(2947):node.js使用
  5. 计算机专业sci二区论文难吗,通信专业二区sci难吗
  6. linux PS1 变量设置
  7. Siemens M65...
  8. acl 影响因子_适合理论、计算化学投稿的期刊及其2016年影响因子(2017年公布)...
  9. Winform实现读写IC卡Demo源码含注释
  10. pdf关键字搜索盖章,长关键字定位
  11. 笔记本重装win10系统
  12. python——获取矩形四个角点的坐标
  13. 程序员必须了解的10大技术搜索引擎
  14. 程序猿怎样变身IT讲师
  15. 基于Springboot社区居民健康档案管理系统 毕业设计-附源码220940
  16. 【Linux】云服务器的购买与Linux远程连接
  17. 鼎捷t100架构_鼎捷T100 管理软件
  18. 星座 member.php,计算 星座 PHP
  19. 【PAT】1030 完美数列 (25 分)
  20. 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。解决办法

热门文章

  1. 2021年ECNU计科考研复试机试 C. 子序列 (尺取)
  2. 信息学奥赛C++语言:蛋糕
  3. 《云计算服务安全能力要求》与《云计算服务安全指南》标准
  4. protonmail邮箱注册
  5. 城市路(信息学奥赛一本通 - T1381)
  6. Better to follow, follow to be better(2019 ICCV)
  7. 物联网毕业设计题目选题大全
  8. Python 四大主流 Web 编程框架
  9. js原生offsetParent解析
  10. 基于红外热成像的行人检测方法