ginx通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。

该模块需要PCRE支持,应在编译nginx时指定PCRE源码目录, nginx安装方法

nginx rewrite指令执行顺序:

1.执行server块的rewrite指令(这里的块指的是server关键字后{}包围的区域,其它xx块类似)
2.执行location匹配
3.执行选定的location中的rewrite指令
如果其中某步URI被重写,则重新循环执行1-3,直到找到真实存在的文件

如果循环超过10次,则返回500 Internal Server Error错误

break指令

语法:break;
默认值:无
作用域:server,location,if

停止执行当前虚拟主机的后续rewrite指令集
break指令实例:

 
1
2
3
4
if ($slow) {
     limit_rate 10k;
     break;
}

if指令

语法:if(condition){...}
默认值:无
作用域:server,location
对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
if条件(conditon)可以是如下任何内容:

  • 一个变量名;false如果这个变量是空字符串或者以0开始的字符串;
  • 使用= ,!= 比较的一个变量和字符串
  • 是用~, ~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用" 或' 包围
  • 使用-f ,!-f 检查一个文件是否存在
  • 使用-d, !-d 检查一个目录是否存在
  • 使用-e ,!-e 检查一个文件、目录、符号链接是否存在
  • 使用-x , !-x 检查一个文件是否可执行

if指令实例

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;
}

return指令

语法:return code;

return code URL;

return URL;
默认值:无
作用域:server,location,if

停止处理并返回指定状态码(code)给客户端。
非标准状态码444表示关闭连接且不给客户端发响应头。
从0.8.42版本起,return 支持响应URL重定向(对于301,302,303,307),或者文本响应(对于其他状态码).
对于文本或者URL重定向可以包含变量

rewrite指令

语法:rewrite regex replacement [flag];
默认值:无
作用域:server,location,if
如果一个URI匹配指定的正则表达式regex,URI就按照replacement重写。
rewrite按配置文件中出现的顺序执行。flags标志可以停止继续处理。
如果replacement以"http://"或"https://"开始,将不再继续处理,这个重定向将返回给客户端。
flag可以是如下参数
last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
permant 返回301永久重定向
最终完整的重定向URL包括请求scheme(http://,https://等),请求的server_name_in_redirect和 port_in_redirec三部分 ,说白了也就是http协议 域名 端口三部分组成。

rewrite实例

 
1
2
3
4
5
6
7
server {
     ...
     rewrite ^(/download/.*)/media/(.*)..*$ $1/mp3/$2.mp3 last;
     rewrite ^(/download/.*)/audio/(.*)..*$ $1/mp3/$2.ra last;
     return 403;
     ...
}

如果这些rewrite放到 “/download/” location如下所示, 那么应使用break而不是last , 使用last将循环10次匹配,然后返回 500错误:

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

对于重写后的URL(replacement)包含原请求的请求参数,原URL的?后的内容。如果不想带原请求的参数 ,可以在replacement后加一个问号。如下,我们加了一个自定义的参数user=$1,然后在结尾处放了一个问号?,把原请的参数去掉。

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

如果正则表达regex式中包含 “}” 或 “;”, 那么整个表达式需要用双引号或单引号包围.

rewrite_log指令

语法:rewrite_log on|off;
默认值:rewrite_log off;
作用域:http,server,location,if
开启或关闭以notice级别打印rewrite处理日志到error log文件。

nginx打开rewrite log例子

rewrite_log on;
error_log logs/xxx.error.log notice;

1.打开rewrite on
2.把error log的级别调整到 notice

set指令

语法:set variable value;
默认值:none
作用域:server,location,if
定义一个变量并赋值,值可以是文本,变量或者文本变量混合体。

uninitialized_variable_warn指令

语法:uninitialized_variable_warn on | off;
默认值:uninitialized_variable_warn on
作用域:http,server,location,if

控制是否输出为初始化的变量到日志

nginx rewrite 指令的更多相关文章

  1. nginx rewrite 指令last break区别最详细的解释

    转自:http://blog.sina.com.cn/s/blog_4f9fc6e10102ux0w.html http://blog.cafeneko.info/2010/10/nginx_rewr ...

  2. nginx的rewrite指令

    需求:我们在接收到一个/api/upload 开头的url的时候 要转发到另外一个地址.但是又不想追加/api/upload  只想追加/upload 地址. Nginx提供了rewrite指令,用于 ...

  3. Nginx Rewrite相关功能-rewrite指令

    Nginx Rewrite相关功能-rewrite指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令

    Nginx Rewrite相关功能-ngx_http_rewrite_module模块指令 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. Nginx Rewrite规则

    location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配 ...

  6. nginx——rewrite模块

    1.什么是Nginx的Rewrite规则? Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressio ...

  7. Nginx 配置指令的执行顺序(九)

    紧接在 server-rewrite 阶段后边的是 find-config 阶段.这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间 ...

  8. Nginx 配置指令的执行顺序(六)

    前面我们在 (五) 中提到,在一个 location 中使用 content 阶段指令时,通常情况下就是对应的 Nginx 模块注册该 location 中的“内容处理程序”.那么当一个 locati ...

  9. Nginx 配置指令的执行顺序(二)

    我们前面已经知道,当 set 指令用在 location 配置块中时,都是在当前请求的 rewrite 阶段运行的.事实上,在此上下文中,ngx_rewrite 模块中的几乎全部指令,都运行在 rew ...

随机推荐

  1. 怎样通过 DLNA 将电脑上的媒体投射到智能电视上

    DLNA 是一种网络设备间共享媒体的解决方案.从 Windows 7 开始就支持 DLNA,现在一些国产智能电视也已经支持 DLNA 了,这就为我们在电脑和电视之间方便地共享多媒体提供了条件. 工具/ ...

  2. netMarketing类库: 类库说明

    这个类库是作者工作中使用的私人类库,本类库适用于自动化行业的软件工程师使用.如果大家在使用中有任何疑问和建议欢迎联系作者, 或者在页面留言. (一) 引用类库 本类库的环境为.net framewor ...

  3. Swagger Annotation 详解

    在软件开发行业,管理文档是件头疼的事.不是文档难于撰写,而是文档难于维护,因为需求与代码会经常变动,尤其在采用敏捷软件开发模式的系统中.好的工具能够提高团队沟通效率,保证系统质量以及缩短项目的交付周期 ...

  4. eclipse的debug模式下启动不了tomcat

    使用eclipse启动tomcat,正常模式下可以启动tomcat,却在debug模式下无法启动tomcat. 这个问题可能是由于eclipse和tomcat的交互而产生的,在以debug模式启动to ...

  5. win10专业版密钥 亲测可用 不断更新

    DR9VN-GF3CR-RCWT2-H7TR8-82QGT 更新时间2018年10月11日

  6. 【2019年04月03日】A股最便宜的股票

    太钢不锈(SZ000825) - 当前便宜指数:161.66 - 滚动扣非市盈率PE:4.62 - 滚动市净率PB:1.03 - 动态年化股息收益率:4.53% - 太钢不锈(SZ000825)的历史 ...

  7. ux.form.field.Month 只能选年、月的时间扩展

    效果如图,亲测6.2.1版本可用,用法同时间选择控件 //月弹窗扩展 //只选月 Ext.define('ux.picker.Month', { extend: 'Ext.picker.Month', ...

  8. vue---computed计算属性的使用

    一直以来在使用vue的时候,会对vue的computed属性和watch属性具体的使用分不清楚,总算花点时间整理了下. computed:通常用于监控自己定义的变量,这个变量可以不再data中定义,直 ...

  9. Gym 100712

    我的作用:增加罚时. noip380分大佬全程带飞出了10T,可惜被我搞的罚时太高了... 那啥,你会发现java代码有两种风格,嗯两个人,c++自然就是自招大佬了... A:大水题略 B:(不是我写 ...

  10. Nestjs 链接mysql

    文档 下插件 λ yarn add @nestjs/typeorm typeorm mysql 创建 cats模块, 控制器,service λ nest g mo cats λ nest g co ...