配合配置实例对常用指令进行说明
## break
停止执行ngx_http_rewrite_module指令集模块,不影响其他模块。
```
server {
listen 8080;
# 此处 break 会停止执行 server 块的 return 指令(return 指令属于rewrite模块)
# 如果把它注释掉 则所有请求进来都返回 ok
break;
return 200 "ok";
location = /testbreak {
break;
return 200 $request_uri;
proxy_pass http://127.0.0.1:8080/other;
}
location / {
return 200 $request_uri;
}
}
# 发送请求如下
# curl 127.0.0.1:8080/testbreak
# /other
# 可以看到 返回 `/other` 而不是 `/testbreak`,说明 `proxy_pass` 指令还是被执行了
# 也就是说 其他模块的指令是不会被 break 中断执行的
# (proxy_pass是ngx_http_proxy_module的指令)
```
## if
```
set $variable "0";
if ($variable) {
# 不会执行,因为 "0" 为 false
break;
}
# 使用变量与正则表达式匹配 没有问题
if ( $http_host ~ "^star\.igrow\.cn$" ) {
break;
}
# 字符串与正则表达式匹配 报错
if ( "star" ~ "^star\.igrow\.cn$" ) {
break;
}
# 检查文件类的 字符串与变量均可
if ( !-f "/data.log" ) {
break;
}
if ( !-f $filename ) {
break;
}
```
## return
### 语法
```
return code [text];
return code URL;
return URL;
return URI;
```
```
# return code [text]; 返回 ok 给客户端
location = /ok {
return 200 "ok";
}
# return code URL; 临时重定向到 百度
location = /redirect {
return 302 http://www.baidu.com;
}
# return URL; 和上面一样 默认也是临时重定向
location = /redirect {
return http://www.baidu.com;
}
```
## rewrite
使用正则表达式regex来匹配uri,匹配成功使用replacement替代uri
### 语法
```
rewrite regex replacement [flag]
```
### 代码实例
![](https://box.kancloud.cn/c0de6c2739fecf311e7aea8738bea59f_825x514.png)
### flag
* last:停止处理当前的`ngx_http_rewrite_module`的指令集,继续搜索更改该location之外的匹配,相当于新来了一个请求。
* break:停止处理当前的`ngx_http_rewrite_module`的指令集,不挑出当前location中继续处理
* redirect:返回客户端302临时重定向
* perment:返回301永久重定向
### 代码实例
~~~
location / {
rewrite ^/test1 /test2;
rewrite ^/test2 /test3 last; # 此处发起新一轮location匹配 uri为/test3
rewrite ^/test3 /test4;
proxy_pass http://www.baidu.com;
}
location = /test2 {
return 200 "/test2";
}
location = /test3 {
return 200 "/test3";
}
location = /test4 {
return 200 "/test4";
}
# 发送如下请求
# curl 127.0.0.1:8080/test1
# /test3
当如果将上面的 location / 改成如下代码
location / {
rewrite ^/test1 /test2;
# 此处 不会 发起新一轮location匹配;当是会终止执行后续rewrite模块指令 重写后的uri为 /more/index.html
rewrite ^/test2 /more/index.html break;
rewrite /more/index\.html /test4; # 这条指令会被忽略
# 因为 proxy_pass 不是rewrite模块的指令 所以它不会被 break终止
proxy_pass https://www.baidu.com;
}
# 发送如下请求
# 浏览器输入 127.0.0.1:8080/test1
# 代理到 百度产品大全页面 https://www.baidu.com/more/index.html;
~~~
rewrite后面没有flag时
1. location中会顺序执行
2. location外也会被依次执行