nginx的http_rewrite模块的rewrite指令
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 指令按如下规则执行
- 依次执行 server 块内的 ngx_http_rewrite_module 模块的指令
- 循环
该模块的 break if return rewrite set 指令按如下规则执行 - 依次执行 server 块内的 ngx_http_rewrite_module 模块的指令
- 循环
- 根据 URI 寻找匹配的 location
- 顺序执行 location 块内的 ngx_http_rewrite_module 模块的指令
- 若有 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.
根据文档
return URL;
等价于 return 302 URLreturn code URL;
限定 code 为 302,303,307,308 之一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指令相关推荐
- Nginx极客时间:rewrite阶段的rewrite模块:return指令
1. rewrite模块的return指令: return指令 是由 rewrite模块提供的 一个非常常用的指令,可以在 SERVER_REWRITE 和 REWRITE 这两个阶段生效, 它可以帮 ...
- Nginx中的rewrite指令(break,last,redirect,permanent)
转载自:Nginx中的rewrite指令(break,last,redirect,permanent) rewite 在server块下,会优先执行rewrite部分,然后才会去匹配location块 ...
- Nginx的rewrite之rewrite指令
rewrite指令 该指令通过正则表达式的使用来改变URI.可以同时存在一个或者多个指令,按照顺序依次对URL进行匹配和处理. URL和URI的区别: URI:统一资源标识符 URL:统一资源定位符 ...
- Nginx源码研究之nginx限流模块详解
这篇文章主要介绍了Nginx源码研究之nginx限流模块详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 高并发系统有三把利器:缓存.降级和限流: 限流的目的是通过对并 ...
- Nginx使用之location和rewrite用法
Nginx使用之location和rewrite用法 一.常见的Nginx正则表达式 二.location 1.location大致可以分为三类 2.location常用的匹配规则 3.locatio ...
- Nginx 附录C 模块编译,调试与测试
Nginx 附录C 模块编译,调试与测试 C.1 编译与安装 环境要求 操作系统:目前Nginx各版本在以下操作系统和平台测试通过: FreeBSD 3 - 10 / i386; FreeBSD 5 ...
- Nginx的location匹配与rewrite重写跳转
目录 Nginx的location匹配与rewrite重写跳转 一.常用的Nginx正则表达式 二.location 分类 location常用的匹配规则 优先级 location示例说明 Rewri ...
- 第1章 安装Nginx及第三方模块
第1章 安装Nginx及第三方模块 标签: 精通Nginx 精通Nginx – 个人笔记 Nginx中文文档 阅读 开源软件架构:Nginx 第1章 安装Nginx及第三方模块 C10K问题 使用包管 ...
- Nginx的下载安装及其配置指令
文章目录 一.Nginx的应用概述 1.Nginx概述 2.Nginx四大应用场景 1.HTTP服务器 2.反向代理 3.负载均衡 4.动静分离 二.Nginx的下载安装及其配置指令 1.环境准备 2 ...
最新文章
- yahoo註冊.com 域名1.99$/年
- Maven学习总结(8)——使用Maven构建多模块项目
- nacos作注册中心+feign接口调用进行服务提供和服务消费代码示例
- 前端学习(2947):node.js使用
- 计算机专业sci二区论文难吗,通信专业二区sci难吗
- linux PS1 变量设置
- Siemens M65...
- acl 影响因子_适合理论、计算化学投稿的期刊及其2016年影响因子(2017年公布)...
- Winform实现读写IC卡Demo源码含注释
- pdf关键字搜索盖章,长关键字定位
- 笔记本重装win10系统
- python——获取矩形四个角点的坐标
- 程序员必须了解的10大技术搜索引擎
- 程序猿怎样变身IT讲师
- 基于Springboot社区居民健康档案管理系统 毕业设计-附源码220940
- 【Linux】云服务器的购买与Linux远程连接
- 鼎捷t100架构_鼎捷T100 管理软件
- 星座 member.php,计算 星座 PHP
- 【PAT】1030 完美数列 (25 分)
- 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。解决办法