参考:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html

Rewrite对应URL Rewrite,即URL重写,就是把传入web的请求重定向到其他URL的过程。

nginx的重写模块rewrite是一个简单的正则表达式匹配与一个虚拟堆叠机结合,依赖于pcre库(这也为我们之前安装的时候为什么需要安装pcre和pcre-devel软件的原因)。

rewrite会根据相关变量重定向和选择不同的配置,从一个 location跳转到另一个 location,不过这样的循环最多可以执行10次,超过后 nginx将返回500错误。

说明:

  • 功能:实现URL的重写,通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向及选择配置。
  • 作用范围:server{},location{},if{}
  • 优先级:执行server块的rewrite指令 > 执行location匹配 >执行选定的location中的rewrite指令。

应用场景

  • 根据特殊变量、目录、客户端的信息进行URL跳转等
  • 网站换新域名后,让旧的域名的访问跳转到信息的域名上
  • 为了让搜索引擎收录网站内容及用户体验更好,企业将动态URL地址伪装成静态地址提供服务

语法

return指令

停止处理并返回指定状态码(code)给客户端。

作用范围:server,location,if

语法格式:

1
return code;
1
2
3
return code [text];
return code URL;
return URL;

if指令

语法格式:

1
if(condition){...}
  • 可作用于 server 和 location 块中。
  • 一般可使用 字符串与变量做匹配 ‘=’ 和 ‘!=’ 。
  • 也可以正则匹配 ‘‘ 或 ‘!’。
  • 检测文件是否存在’-f’ 或 ‘!-f’ ,目录则是 ‘-d’。
  • 检查文件,目录,软链接是否存在’ -e’ 或者 ‘!-e’。
  • 检查是否为可执行文件,使用’-x’ 或者 ‘!-x’。

示例:

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

break指令

停止执行当前虚拟主机的后续rewrite指令集。

作用范围:server,location,if

示例:

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

rewrite 指令

rewrite 的语法是这样的,可以通过rewrite_log on; 记录rewrite。

1
rewrite regex replacement [flag];

将regex指定的url替换成 replacement 这个新的url。

当replacement以 http:// 或者 $schema 开头,直接会返回302重定向。

替换后的url根据flag指定的方式进行处理。

  • last:用replacement这个url 重新进行location匹配。
  • break:break指令停止当前脚本的执行,不再匹配。
  • redirect:返回302重定向。
  • permanent:返回301重定向。

set指令

作用范围:server, location, if

语法格式:

1
set $variable value;