ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
配合配置实例对常用指令进行说明 ## 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外也会被依次执行