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; }
|
实例二:补充官方的例子
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
|