死磕nginx系列--nginx服务器配置rewrite功能

rewrite这个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置。
如果这个指令在server字段中指定,那么将在被请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。如果在location中执行这个指令产生了新的URI,那么location又一次确定了新的URI。
这样的循环可以最多执行10次,超过以后nginx将返回500错误。

1
2
3
格式:	rewrite regex replacement [flag];
默认参数: —
作用域 : server, location, if
  • regex: 支持正则表达式,字符串等。
  • replacement:匹配规则后的重定向。
  • [flag]的参数包括:
  • last :表示完成rewrite,浏览器地址栏URL地址不变
  • break;本条规则匹配完成后,终止匹配,不再匹配后面的规则,浏览器地址栏URL地址不变
  • redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,如果替换字段用http://开头则被使用
  • permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

last 和 break的区别 break匹配完成不继续匹配,last匹配完成后,会使用新的URL继续向下匹配。

1
2
3
4
5
6
7
8
9
10
11
12
server {
location / {
rewrite /last/ /1.html last;
rewrite /break/ /1.html break;
}

location = /1.html {
return 400;
}
}
访问/last/时重写到/1.html,然后使用新的uri再匹配,正好匹配到locatoin = /q.html然后返回了400
访问/break时重写到/1.html,由于返回了break,则直接停止了

实例一:将 /work/* 重写为* 、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream work {
server 192.168.56.12:8080;
server 192.168.56.11:8080;
}
server {
listen 80;
server_name blog.biglittleant.cn;

location /work/ {
rewrite "^/work/(.+)" /$1 break;
proxy_pass http://work;
}
location / {
root html;
index index.html index.htm;
}

实例二:补充官方的例子

1

if模块

1
2
3
格式:	if (condition) { ... }
默认值: —
作用域: server, location

if判断如果结果为true,那么在大括号中指定的模块指令将被执行,并且请求被分配在if指令内部的配置。 if指令内的配置继承自先前的配置级别。条件可以是以下任何一个:变量名;如果变量的值为空字符串或“0”,则为false;在版本1.0.1之前,以“0”开头的任何字符串被视为false值。

  • 使用“=”和“!=”运算符将变量与字符串进行比较;
  • 使用“〜”(区分大小写匹配)和“〜*”(区分大小写匹配)运算符匹配正则表达式。
  • 正则表达式中的括号包含起来以后在$ 1 .. $ 9变量中重用的捕获。负运算符“!〜”和“!〜*”也可用。
  • 如果正则表达式包含“}”或“;”字符,则整个表达式应用单引号或双引号括起来。
  • 使用“-f”和“!-f”运算符检查文件存在;
  • 使用“-d”和“!-d”运算符检查目录存在;
  • 使用“-e”和“!-e”运算符检查文件,目录或符号链接是否存在;
  • 使用“-x”和“!-x”运算符检查可执行文件。
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模块

1
2
3
4
5
6
格式:	return code [text];
return code URL;
return URL;
默认值: —
作用域: server, location, if