一    官方rewrite模块

1)这个模块作用于'SERVER_REWRITE'和'REWRITE'阶段,前者的优先级'较高'2)根据rewrite模块出现在'server{}'还是'location{}',判断属于'哪个'阶段

①   模块涉及的指令

②   基本简介

pcre下载地址

pcretest测试正则表达式

二   return指令细讲

①  return

说明: 首先'讲解'这个指令的原因是,我们经常拿来'做测试'使用备忘录: 返回'文本(text)'的时候,经常忘记加'code'

影响重定向的几个指令

nginx 444 状态码

444: nginx的444状态被服务器'直接断开'连接,'不再向客户端返回'消息,简单粗暴307:使用'源请求'使用的method,而且会携带'源请求的body'作为重定向请求的包体

②  小程序验证码

背景: '百度、微信等'小程序跳转'华为云、腾讯云、阿里云'时候,必须验证说明: default_type 设置'text/plain',是'避免'浏览器下载实际: 根据'txt'后缀会自动根据'mine.type'返回'对应的Content-Type

③  优先级问题

(1)执行阶段优先级

'动作类'指令:无法'合并'

(2)同一阶段同一模块不同指令的优先级

+++++++++  "对比实验"  +++++++++同一阶段同一模块不同指令的优先级:按照在'配置文件'中出现的'先后'顺序

(3)return和error_page优先级

说明: 默认'error_page'只拦截'静态',不拦截'动态(后端返回的)'的指定'错误'状态码是否'补获'后端错误: 'proxy_intercept_errors'开关指令

1)error_page是'少有'的、集成到'http框架中'的指令,'它不归属'任何阶段2)仅当可能'返回错误指令'时,才会'使用'到它3)所有阶段'都可能'返回响应,例如access、preaccess、rewrite等等,'error_page'可能会补获

+++++++++  "对比实验"  +++++++++说明: 'return code'的优先级比相同code 'error_page code' 优先级高

(4)return和echo指令的优先级

场景: 这两个'经常'用来做临时'调试'

解读:echo指令在'content阶'段执行,而'return'总在content阶段'之前'

④  常用案例

需求1: http'跳转'到httpsserver {listen 80;server_name www.wzj.com;return 301 https://$http_host$request_uri;
}+++++++++++++++ "分割线"  +++++++++++++++需求2:临时'调试'return 200 $name $request_uri;default_type application/json;
return 200  '{"name":"aming","id":"100"}';  # 返回json的形式+++++++++++++++ "分割线"  +++++++++++++++需求3:请求后缀'过滤'location ~ .*\.(sh|bash)?$ {return 403;# deny all;
}+++++++++++++++ "分割线"  +++++++++++++++需求4:网站被黑了,凡是在'百度点击到本网站'的请求,全部都跳转到了一个'赌博'网站if ($http_referer ~ 'baidu.com') {return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}

三  rewrite指令细讲

①  rewrite

[1]、在一个 URL 请求中,rewrite 如果'匹配到' regex,那么 URL 就会'替换'成 replacement[2]、如果'不考虑' flag,匹配规则'多个rewrite'是'顺序执行'的,即使匹配到了,仍然'会继续'匹配下去[3]、如果 replacement 包含 "http://", "https://", or "$scheme",那么匹配会'立即终止',并直接'重定向地址'给客户端++++++++++ 'rewrite'哪些是重定向,哪些是'内部'转发  ++++++++++1、涉及'https'、'http'、'$scheme' 都是'外部'重定向rewrite ... https|http|$scheme 这三种,默认是'redirect(302)',可以自己指定'permanent(301)'特点:一旦匹配上,立即终止'处理','直接返回'给客户端'301、302','不会'重新进行'find_location'阶段细节点:客户端的'地址栏'会发生变化 ;原因:浏览器根据'301、302'的状态码+'Location'响应头再发一次请求curl -Lv 查看详细'交互'过程2、如果'replacement'不是上述的,或者'不是'返回给客户端'301、302'响应状态码,则是'内部'跳转

②  案例讲解

(1)案例1  重定向

+++++++++ '补充' +++++++++1)一旦'重定'向了,该'location 块'中后续的其它'rewrite脚本指令集'不再执行2)细节点: 'add_header'还是会被执行

(2)案例2  break

体会: 'break'标志位的作用 -->只是'跳过当前'的rewrite阶段,并执行'本请求后续'的执行阶段说明: location中包含'rewrite'模块多个'脚本指令的set集合'

++++++++++  "对比实验"  ++++++++++

(3)  nginx rewrite 中last break flag区别

++++++++++++++++++"假定rewrite在location中"++++++++++++++++++[1].  last 和 break一样 它们都会'终止'此 location 中'其它rewrite模块指令'的执行[2].  但是 last 立即发起'新一轮'的 location 匹配 而 break 则'不会'补充: 'break'跳过'当前的rewrite'阶段,并执行本请求'输出'阶段++++++++++++++++++++++++"分割线"++++++++++++++++++++++++
​
[1].  flag 参数'如果'是 'redirect' 或 'permanent',那么处理就相对简单,立刻'中止规则匹配',进行 302 或 301 跳转[2].  如果在 location 中配置 'flag 是 last',立刻'跳出本 location' 的匹配,同时会顺序'继续搜寻其他' location 的匹配,如果还'没匹配'到,还会继续'搜寻本' location[3].  而 break '跳出本' location 后就'不会再匹配'其它 location 了

案例汇总

1. 如果'rewrite'同一个上下文'有多个'这样的规则:无'https、http、$scheme',也无'flag'标识2. 匹配会按照'rewrite'指令出现的'先后'顺序依次进行,匹配到一个后'不会终止',而是继续往下匹配,直到返回'最后一个匹配上'的为止

+++++++++++++++++"分割线1"+++++++++++++++++

+++++++++++++++++"分割线2"+++++++++++++++++

+++++++++++++++++"分割线3"+++++++++++++++++

请求: http//rewrite.wzj.com/break/xx输出: 'break page'涉及: static和echo 模块'优先'级;root指令属于'static'模块分析: 1. break是'跳过当前请求'的rewrite阶段,并'继续执行本请求'的'其他'阶段2. 很明显,对于/break 对应的'content阶段'的输出为 echo "break page"3. content阶段,可以简单理解为'产生数据输出的阶段'4. echo指令也是'运行在content阶段',一般情况下content阶段只能'对应一个'输出指令,如同一个location'配置两个echo',最终只会有一个echo指令被执行5. 当然如果你把'/break/'里的'echo 指令注释',然后再次访问/break/xx会'报404','static'模块起作用6. 虽然/break/xx'被重定向'到/test/xx,但是break指令'不会重新开启一个新的请求'继续匹配,所以nginx是'不会匹配到下面'的/test/这个location7. 在echo指令'被注释'的情况下,/break/ 这location里'只能执行'nginx'默认'的content指令,即'尝试找/test/xx这个html页面'并输出起内容,事实上,这个页面'不存在',所以会报404的错误++++++++++++++  "分割线"  ++++++++++++++请求: http//rewrite.wzj.com/last/xx输出: 'test page'分析: 1. last与break最大的'不同'是,last会'重新发起'一个新请求,并'重新匹配'location2. 所以对于/last,重新匹配请求以后'会匹配到/test/',所以最终'对应的content阶段'的输出是test page;

echo模块源码安装

(4) 死循环场景

(5)查询参数

1. rewrite /a.html /new permanent          -->重定向'带原始参数'的地址2. rewrite /a.html /new? permanent         -->重定向'不带'参数3. rewrite /a.html /new?age=18 permanent   -->重定向'追加'查询参数4. rewrite /a.html /new?id=$arg_id&name=$arg_name? permanent -->重定向只'带指定'参数说明: '4'实质是'自定义查询参数'

return, rewrite, and try_files对比 辅助参考

③  rewrite的应用场景

④  rewrite使用正则的注意事项

注意: 正则中使用 "}" or ";" ,必须使'(用单|双)'引号,因为'}、;'在nginx.conf有'特殊'含义

四   break指令细讲

①  break

疑惑点: 结束'该作用域'下剩余的指令,还是'只是该rewrite模块的'指令?

(1)配置demo

( 2)不带参数请求

(3)带参数请求

由于URL中'&、&'不转义,curl请求最好加上'单引号',如果想使用'shell变量'则使用"双引号"
​
遗留:带参数同时配置中的'break'关闭看看效果效果:整个请求就'被终止'了,后续的指令都'不'执行了,直接返回'404'

nginx的11个阶段

五   rewrite_log指令细讲

①  rewrite_log

error.log开启'notice'级别,默认是'error'

六  if指令细讲

①  if

遗留: 简单记住在if里'只有rewrite的模块指令'是'安全'的
if指令'掌握'两个点:'自定义[set]'和'内置(模块提供)'变量和'正则'形式掌握:if (condition) {} 中'condition'的场景

②  if 的 and else or 等价用法

++++++++++++++ '官方'案例  ++++++++++++++$request_filename:当前'连接请求'的文件路径,由'root'或'alias指令'与URI请求生成

相关案例参考

if ( $http_cookie ~* "name=wzj")   -->cookie'数据太大',优点不明显if (remotr_addr ~* ^172\.25\.2\.*) -->限定'部分ip'访问++++++++++++  server块中  ++++++++++++ if ($request_uri ~ /vnc/include/(.+)) {set $parms $1;# 体会这个'含义',个人感觉是终止'server中执行rewrite的'阶段break;
}location /vnc {proxy_pass http://www.wzj.com/$parms
}

高级:nginx 剔除 $args 变量中任意指定参数

七   set指令细讲

①  set

细节点: 除了'变量$args'可以被'修改'以外,其'对应的子变量值'都只能'被查看'而'不能'进行修改补充: if、rewrite、set'自定义'、map、location、server_name -->可以'产生变量'

 作用域问题

②   uninitialized_variable_warn

③  遗留

1. 使用 alias 指令时,必须使用 last;2. 使用 proxy_pass 指令时,则必须使用break

八   高级正则

①  普通补获

捕获 (exp) :匹配exp,并捕获文本到'自动命名$1、$2、...$9'的组里 --> "常见"

+++++++++++ 'http跳转到https' +++++++++++server {listen 80;server_name www.wzj.com ;rewrite ^(.*) http://www.wzj.com$1 permanent;
}

②  命名捕获

(?<name>exp):匹配exp,并'捕获文本'到名称为'name的组'里,也可以写成(?'name'exp)说明:能'看懂'即可

③   非补获

​1.  语法:(?:pattern)2.  解读:'非获取匹配','匹配'pattern但'不获取'匹配结果,'不进行存储'供以后使用3.  这在使用或字符"(|)"来组合一个'模式'的'各个部分'是很有用4.  例如:'industr(?:y|ies)'就是一个比'industry|industries'更简略的表达式++++++++++ "案例讲解"  ++++++++++if ($uri ~* \.(?:html|css|js|json)$){proxy_pass http://static/wzj.com
}+++++++++ nginx自行对"/"处理 +++++++++~* ^\/wzj\/(.+?\.(?:html|css|js))$   说明:'/'不需要跟'shell'正则一样转义,nginx会'自行'处理

.*、.*?、.+?的含义

④  零宽度断言

shell常用正则表达式

四个'非捕获组'用于匹配pattern'或者'不匹配pattern位置'之前'或'之后'的内容,匹配的结果'不包括'pattern补充:(?#comment),这种类型的分组'不对'正则表达式的处理产生任何影响,用于'提供注释'让人阅读

1)案例一

location ~* (?!.*/wzj/favicon).*(\.ico)$ {rewrite ^(.*) http://rewrite.wzj.com/static/wzj/favicon/favicon.ico permanent;# 备注:rewrite 'https://' --> 所以下面'return 301'不会执行return 301;
}

[1].  $request_uri 是'待匹配'的字符串http://rewrite.wzj.com'/aa/bb/cc.ico'http://rewrite.wzj.com'/wzj/favicon/favicon.ico'http://rewrite.wzj.com'/wzj/favicon/favicon.txt'[2].  (?!.*/wzj/favicon).*(\.ico)$ 是'正则模式'

遗留点:'回溯'的过程?

⑤  贪婪和非贪婪模式

浅谈nginx反向代理中神奇的斜线  整理的案例

九   相关参考

break和last理解

rewrite官方的一些案例

websocket官方配置

internal 指令限制访问图片资源文件

nginx internal 语法 – SRE笔记

nginx(三十二)rewrite模块相关推荐

  1. python三十二:os模块

    os模块是与操作系统交互的一个模块. import os print(os.getcwd()) # 获取当前工具目录,即当前python脚本工作的目录路径 os.chdir("test&qu ...

  2. NeHe OpenGL第三十二课:拾取游戏

    NeHe OpenGL第三十二课:拾取游戏 拾取, Alpha混合, Alpha测试, 排序: 这又是一个小游戏,交给的东西会很多,慢慢体会吧   欢迎来到32课. 这课大概是在我所写作已来最大的一课 ...

  3. 【正点原子FPGA连载】第三十二章RTC实时时钟LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...

  4. 1709 ltsb 内存占用_「正点原子STM32Mini板资料连载」第三十二章 内存管理实验

    1)实验平台:正点原子STM32mini开发板 2)摘自<正点原子STM32 不完全手册(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第三十二章 内存管理实验 上一章,我 ...

  5. axi dma 寄存器配置_FPGA Xilinx Zynq 系列(三十二)AXI 接口

    大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分.大侠可以关注FPGA技术江湖,在"闯荡江湖"."行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢. ...

  6. ASP 三十二条精华代码

    整理收藏: ASP 三十二条精华代码 1. οncοntextmenu="window.event.returnvalue=false" 将彻底屏蔽鼠标右键 <table b ...

  7. tensorflow学习笔记(三十二):conv2d_transpose (解卷积)

    tensorflow学习笔记(三十二):conv2d_transpose ("解卷积") deconv解卷积,实际是叫做conv_transpose, conv_transpose ...

  8. Python编程基础:第三十六节 模块Modules

    第三十六节 模块Modules 前言 实践 前言 我们目前所有的代码都写在一个文档里面.如果你的项目比较大,那么把所有功能写在一个文件里就非常不便于后期维护.为了提高我们代码的可读性,降低后期维护的成 ...

  9. OpenCV学习笔记(三十一)——让demo在他人电脑跑起来 OpenCV学习笔记(三十二)——制作静态库的demo,没有dll也能hold住 OpenCV学习笔记(三十三)——用haar特征训练自己

    OpenCV学习笔记(三十一)--让demo在他人电脑跑起来 这一节的内容感觉比较土鳖.这从来就是一个老生常谈的问题.学MFC的时候就知道这个事情了,那时候记得老师强调多次,如果写的demo想在人家那 ...

最新文章

  1. Kaggle入门,看这一篇就够了
  2. JQuery插件:ScrollTo平滑滚动到页面指定位置
  3. autoencoder
  4. 数学建模——线性规划模型详解Python代码
  5. Android官方开发文档Training系列课程中文版:与其它APP交互之将用户带到其它的APP
  6. java递归实现多级菜单栏_vue+ java 实现多级菜单递归效果
  7. java 云笔记本_java版云笔记(五)
  8. PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。...
  9. ubuntu修改运行级别方法
  10. 浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
  11. paper 88:人脸检测和识别的Web服务API
  12. 一张图了解CAS单点登录的流程
  13. 利用edge模拟ie8浏览器环境
  14. TOM邮箱|选出好用的邮箱让你事半功倍
  15. 海洋cms 模板标签手册
  16. 关于Http的一些基础内容
  17. 阿里的BUG智能定位神器!直接定位线上BUG,超给力!必须收藏!
  18. 分布式锁1 Java常用技术方案
  19. java自动发图文微博_使用node搭建自动发图文微博机器人的方法
  20. VCC,VDD,VEE,VSS,VPP 表示的意义

热门文章

  1. 微积分近似计算公式:中点、梯形、辛普森
  2. 关于BZOJ如何注册问题
  3. java作业斗地主实现
  4. 2021年10月管理体系认证基础考试真题试卷
  5. 塞尔达 amiibo_极客历史的本周:塞尔达(Zelda)25岁,印刷机的诞生,以及ENIAC的揭幕...
  6. C# OpenCV EmguCV LSD直线检测使用Demo
  7. PTA平台编程题 Java代码模板
  8. iis高并发 大量数据并发设置
  9. 攻击方法与工业控制系统安全
  10. 整除判断游戏能显著提高小朋友的逻辑思维能力,问题要求如下:• 能同时被 3、5、7 整除• 能同时被 3、5 整除• 能同时被 3、7 整除• 能同时被 5、7 整除• 只能被 3、5、7