本专栏非常感谢大家得关注和支持,本人开源项目站点https://erosbt.com 将自己热爱与信仰的技术,持续不辍地传递。

  • Nginx专栏

    • 手把手教你Nginx常用模块详解之ngx_http_access_module(一)
    • 手把手教你Nginx常用模块详解之ngx_http_addition_module(二)
    • 手把手教你Nginx常用模块详解之ngx_http_api_module(三)
    • 手把手教你Nginx常用模块详解之ngx_http_gzip_module(四)
    • 手把手教你Nginx常用模块详解之ngx_http_limit_conn_module(五)
    • 手把手教你Nginx常用模块详解之ngx_http_upstream_module(六)
    • 手把手教你Nginx常用模块详解之ngx_stream_ssl_module(七)
    • 手把手教你Nginx常用模块详解之ngx_stream_upstream_module(八)
    • 手把手教你Nginx常用模块详解之ngx_http_perl_module(九)
    • 手把手教你Nginx常用模块详解之ngx_http_rewrite_module(十)
    • 手把手教你Nginx常用模块详解之ngx_http_status_module(十一)

    一. 指令

ngx_http_rewrite_module

该ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向并有条件地选择配置。

break,if,return,rewrite和set指令按以下顺序处理:

在服务器级指定的该模块的指令是按顺序执行的;
反复:

  • 基于请求URI来搜索位置;
  • 在找到的位置内指定的该模块的指令是按顺序执行的;
  • 如果请求URI被重写,则重复循环但不超过10次。

二. 语法

句法: break;
默认:
语境: 服务器,位置,if

停止处理当前的一组ngx_http_rewrite_module指令。

如果在位置内指定了指令,则在该位置继续处理请求。
例:

if ($slow) {limit_rate 10k;break;
}
句法: if(condition){…}
默认:
语境: 服务器,位置

指定condition的评估。如果为true,则在花括号内指定的模块指令被执行,并且该请求被分配if指令内的配置。if指令内的配置从先前的配置级别继承。
$ invalid_referer嵌入式变量的值由valid_referers指令设置。

句法: 返回代码文本;返回码URL;返回URL;
默认:
语境: 服务器,位置,if

停止处理并将指定的内容返回code给客户端。非标准代码444在不发送响应报头的情况下关闭连接。

从版本0.8.42开始,可以指定重定向URL(对于代码301,302,303,307和308)或响应主体text(对于其他代码)。响应正文文本和重定向URL可以包含变量。作为特殊情况,可以将重定向URL指定为此服务器本地的URI,在这种情况下,完整重定向URL根据请求方案($scheme)和server_name_in_redirect和port_in_redirect指令形成。

另外,URL可以将具有代码302的临时重定向指定为唯一参数。这样的参数应该以“ http://”,“ https://”或“ $scheme”字符串开头。一个URL可以包含变量。

在版本0.7.51之前仅可以返回以下代码:204,400,402-406,408,410,411,413,416和500-504。代码307不被视为重定向直到版本1.1.16和1.0.13。代码308在版本1.13.0之前不被视为重定向。

另请参阅error_page指令。

句法: 重写正则表达式替换标志;
默认:
语境: 服务器,位置,if

如果指定的正则表达式与请求URI匹配,则URI将按replacement字符串中指定的方式更改。这些rewrite指令按照其在配置文件中的顺序依次执行。可以使用标志来终止对指令的进一步处理。如果替换字符串以“ http://”,“ https://”或“ $scheme” 开头,则处理停止并且重定向返回给客户端。

可选flag参数可以是以下之一:

last停止处理当前的ngx_http_rewrite_module指令集并开始搜索匹配改变的URI的新位置; 像break指令一样break停止处理当前的一组ngx_http_rewrite_module指令; redirect返回302代码的临时重定向; 如果替换字符串不以“ http://”,“ https://”或“ $scheme” 开头,则使用该字符串; permanent返回301代码的永久重定向。

完整的重定向URL根据请求方案($scheme)和server_name_in_redirect和port_in_redirect指令形成。

例:

server {...rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  last;return  403;...
}

但是,如果这些指令放在“ /download/”位置内,那么该last标志应该被替换break,否则nginx会做10个周期并返回500错误:

location /download/ {rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra  break;return  403;
}

如果一个replacement字符串包含新的请求参数,那么之前的请求参数将被追加。如果这是不希望的,那么在替换字符串的末尾添加一个问号可以避免添加它们,例如:

rewrite ^/users/(.*)$ /show?user=$1? last;

如果正则表达式包含“ }”或“ ;”字符,则整个表达式应该用单引号或双引号括起来。

句法: rewrite_log 开启& 关闭;
默认: rewrite_log 关闭;
语境: http,服务器,位置,if

启用或禁用将ngx_http_rewrite_module模块指令处理结果记录到notice级别的error_log中。

句法: 设置$ variable值;
默认:
语境: 服务器,位置,if

value为指定的设置一个variable。该value可以包含文本,变量,他们的组合。

句法: uninitialized_variable_warn 开启 & 关闭;
默认: uninitialized_variable_warn on;
语境: http,服务器,位置,if

控制是否记录有关未初始化变量的警告。

内部实施
该ngx_http_rewrite_module模块指令是在配置阶段编译成被请求处理过程中解释内部指示。解释器是一个简单的虚拟堆栈机器。

例如,指令

location /download/ {if ($forbidden) {return 403;}if ($slow) {limit_rate 10k;}rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;
}

将被翻译成这些说明:

variable $forbidden
check against zeroreturn 403end of code
variable $slow
check against zero
match of regular expression
copy "/"
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code

请注意,上面的limit_rate指令没有说明,因为它与ngx_http_rewrite_module模块无关。为if块创建一个单独的配置。如果条件成立,则将该配置分配给limit_rate等于10k 的请求。

指令

rewrite ^/(download/.*)/media/(.*)\..*$ /$1/mp3/$2.mp3 break;

如果正则表达式中的第一个斜杠放在括号内,可以通过一条指令缩小:

rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break;

相应的说明将如下所示:

match of regular expression
copy $1
copy "/mp3/"
copy $2
copy ".mp3"
end of regular expression
end of code

三. 示例

if ($http_user_agent ~ MSIE) {rewrite ^(.*)$ /msie/$1 break;
}if ($http_cookie ~* "id=([^;]+)(?:;|$)") {set $id $1;
}if ($request_method = POST) {return 405;
}if ($slow) {limit_rate 10k;
}if ($invalid_referer) {return 403;
}
  • 变量名称; 如果变量的值是空字符串或“ 0”,则为false ; 在版本1.0.1之前,任何以“ 0” 开头的字符串都被认为是错误的值。
  • 使用“ =”和“ !=”运算符比较变量和字符串;
  • 使用“ ~”(区分大小写的匹配)和“ ~”(区分大小写的匹配)运算符将变量与正则表达式匹配。正则表达式可以包含可供稍后在$1… $9变量中重用的捕获。负运营商“ !~”和“ !~”也是可用的。如果正则表达式包含“ }”或“ ;”字符,则整个表达式应该用单引号或双引号括起来。
  • 用“ -f”和“ !-f”操作符检查文件是否存在;
  • 用“ -d”和“ !-d”运算符检查目录是否存在;
  • 使用“ -e”和“ !-e”运算符检查文件,目录或符号链接的存在性;
  • 使用“ -x”和“ !-x”运算符检查可执行文件

以上更多详解请大家关注nginx官方网站https://nginx.org/en/docs/

以上就是我们今天的教程,如果本文对你有所帮助,欢迎关注点赞,分享给您身边的朋友。您的鼓励就是对我的最大动力。

手把手教你Nginx常用模块详解之ngx_http_rewrite_module(十)相关推荐

  1. 手把手教你Nginx常用模块详解之ngx_http_status_module(十一)

    本专栏非常感谢大家得关注和支持,本人开源项目站点https://erosbt.com 将自己热爱与信仰的技术,持续不辍地传递. Nginx专栏 手把手教你Nginx常用模块详解之ngx_http_ac ...

  2. Ansible基本使用及常用模块详解

    一.ansible基本使用 定义主机组 定义被管理节点列表的文件/etc/ansible/hosts,在定义被管理节点的时候,可以单独基于主机做定义,也可以将多个主机定义成一个主机组. 在上篇博文安装 ...

  3. 三、教你搞懂渐变堆叠面积图《手把手教你 ECharts 数据可视化详解》

    注:本系列教程需要对应 JavaScript .html.css 基础,否则将会导致阅读时困难,本教程将会从 ECharts 的官方示例出发,详解每一个示例实现,从中学习 ECharts . ECha ...

  4. nginx常用配置详解

    一.nginx配置文件结构: ... #全局块 events { #events块 ...} http #http块{ ... #http全局块 server #server块 { ... #serv ...

  5. Ansible常用模块详解

    Ansible常用模块 2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7 ...

  6. Nginx配置模块详解及多站点共用80端口案例

    nginx配置 nginx配置文件主要分为四个部分: main(全局设置) http ( ) upstream(负载均衡服务器设置) server(主机设置) location(URL匹配特点位置的设 ...

  7. python模块讲解_python中常用模块详解一

    1.time 模块 import time s = time.localtime() # 把时间转化成格式化的时间,通过. 取得里面的年月日等 struct_time 格式 time.struct_t ...

  8. Ansible自动化运维的安装及常用模块详解

    Ansible作为今年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误.Ansible通过本身集成的非常丰富的模块可以实现各种管理任务, ...

  9. nginx upstream 模块详解

    http://tengine.taobao.org/book/chapter_05.html#id1

最新文章

  1. php适合做后台吗,php是否适合做后台长驻程序
  2. JavaScript 技术篇-chrome利用ClipboardEvent写入剪切板,chrome写入剪切板不成功解决方法
  3. Beetlex之redis驱动
  4. tcp 测试软件,ztcp
  5. Maven项目无法加载jdbc.properties
  6. 神奇的幻方(洛谷P2615题题解,Java语言描述)
  7. centos7配置静态ip地址
  8. 怎样搭建本地svn服务器环境-轻松掌握版本管理
  9. 随想录(爬虫的几个技巧)
  10. 谷歌-安卓系统使用必读,什么是root, Recovery, Radio, APP TO SD, Rom
  11. 纯生js ajax,纯生js实现Element中input组件的部分功能(慢慢完善)并封装成组件
  12. 自定义圆环形进度条实现
  13. MouseManager
  14. Hive 数据同步ClickHouse
  15. 神经网络实现逻辑运算,神经网络 最小二乘法
  16. To B商业史系列 01:在线办公的潮起潮落
  17. 专业jpg转pdf软件
  18. JAVA高级篇之Java Reflection详解
  19. TICC- TimeSeries Analyze
  20. 大数据学习之hadoop——07阿里云服务器搭建集群以及遇到的问题解决办法

热门文章

  1. 安装jQuery在Dreamweaver中的插件jQuery_API.mxp
  2. 基于c#的舞蹈教学网站
  3. [友谊篇FRIENDSHIP]Learn with whole Life 一生的学习
  4. python列表元素求和_如何在python语言使用不同方法实现列表元素求和
  5. 秋实大哥与线段树 UESTC - 1073
  6. 35岁前成功的黄金法则(3)-三大技巧
  7. 制作简易计算器:接收用户输入,两个操作数,一个操作符,给出用户结果。2021/01/17
  8. 双击计算机桌面图标不属于,我电脑桌面上的图标双击后会出现的是属性而不 – 手机爱问...
  9. Mac系统入门之电脑卡死怎么办
  10. 近50年数据库技术发展史