💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
## **使用的场景** 1、URL访问跳转,支持开发设计 页面跳转、兼容性支持、展示效果等 2、SEO优化 3、维护 后台维护、流量转发等 4、安全 ## **配置语法** ``` Syntax:rewrite regex replacement [flag]; regex匹配需要改写的url或者路径。replacement目标要替换成哪个url或路径 Dfault:- Context:server,location,if ``` ### **ngx_http_rewrite_module 模块用来使用正则表达式(PCRE)改变请求的URI,返回重定向,并有条件地选择配置。** ### **指令执行顺序** 1. 首先顺序执行server块中的rewrite模块指令,得到rewrite后的请求URI 2. 然后循环执行如下指令 ~~~ 如果没有遇到中断循环标志,此循环最多执行10次,但是我们可以使用break指令来中断rewrite后的新一轮的循环 ~~~ (1). 依据rewrite后的请求URI,匹配定义的 location 块 (2). 顺序执行匹配到的 location 中的rewrite模块指令 ### **rewrite指令break,if,return,rewrite,set,Uninitialized_variable_warn** 1.break指令 使用环境:**server,location,if** 停止执行 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的指令) ``` 2.if指令 使用环境:**server,location** 该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。 1. 一个`变量名`,如果变量 $variable 的值为空字符串或者字符串"0",则为false 2. `变量`与一个字符串的比较 相等为(=) 不相等为(!=)`注意此处不要把相等当做赋值语句啊` 3. `变量`与一个正则表达式的模式匹配 操作符可以是(`~`区分大小写的正则匹配,`~*`不区分大小写的正则匹配,`!~``!~*`,前面两者的非) 4. 检测文件是否存在 使用`-f`(存在) 和`!-f`(不存在) 5. 检测路径是否存在 使用`-d`(存在) 和`!-d`(不存在) 后面判断可以是字符串也可是变量 6. 检测文件、路径、或者链接文件是否存在 使用`-e`(存在) 和`!-e`(不存在) 后面判断可以是字符串也可是变量 7. 检测文件是否为可执行文件 使用`-x`(可执行) 和`!-x`(不可执行) 后面判断可以是字符串也可是变量 ``` ###default traderwork china set $tui_uri /trader-work/qa/v7.22.0/index.html; set $tui_host http://test.oss-cn-hangzhou.aliyuncs.com; set $tpui_host test.oss-cn-hangzhou.aliyuncs.com; ###out if ($geoip2_data_country_code != 'CN') { set $tui_uri /trader-work/qa1/v7.22.0/index.html; set $tui_host http://test.lwork.com; set $tpui_host test.lwork.com; } ``` ``` 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; } ``` 3.return指令 语法:returncode ; 使用环境:**server,location,if** 该指令用于结束规则的执行并返回状态码给客户端。 示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码 location ~ .*\.(sh|bash)?$ { return 403; } 4.rewrite 指令 语法:rewriteregex replacement flag 使用环境:**server,location,if** `rewrite`指令是使用指定的正则表达式`regex`来匹配请求的`urI`,如果匹配成功,则使用`replacement`更改`URI`。`rewrite`指令按照它们在配置文件中出现的顺序执行。可以使用`flag`标志来终止指令的进一步处理。如果替换字符串`replacement`以`http://`,`https://`或`$ scheme`开头,则停止处理后续内容,并直接重定向返回给客户端。 ``` #第一种情况 重写的字符串 带http:// location / { # 当匹配 正则表达式 /test1/(.*)时 请求将被临时重定向到 http://www.$1.com # 相当于 flag 写为 redirect rewrite /test1/(.*) http://www.$1.com; return 200 "ok"; } # 在浏览器中输入 127.0.0.1:8080/test1/baidu # 则临时重定向到 www.baidu.com # 后面的 return 指令将没有机会执行了 #################################### #第二种情况 重写的字符串 不带http:// location / { rewrite /test1/(.*) www.$1.com; return 200 "ok"; } # 发送请求如下 # curl 127.0.0.1:8080/test1/baidu # ok # 此处没有带http:// 所以只是简单的重写。请求的 uri 由 /test1/baidu 重写为 www.baidu.com # 因为会顺序执行 rewrite 指令 所以 下一步执行 return 指令 响应了 ok ``` ### **rewrite 的四个 flag** 1. `last` 停止处理当前的`ngx_http_rewrite_module`的指令集,并开始搜索与更改后的`URI`相匹配的`location`; 2. `break` 停止处理当前的`ngx_http_rewrite_module`指令集,就像上面说的`break`指令一样; 3. `redirect` 返回302临时重定向。 4. `permanent` 返回301永久重定向。 ``` # location ^~ /test1/ { #拦截请求,匹配任何以/test1/开头的地址 rewrite ^/test1 /test2; rewrite ^/test2 /more/index.html break; # 重写拦截进来的请求,重写后的uri为 /more/index.html 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 后的请求参数** 如果替换字符串`replacement`包含新的请求参数,则在它们之后附加先前的请求参数。如果你不想要之前的参数,则在替换字符串`replacement`的末尾放置一个问号,避免附加它们。 5.Set指令 语法:setvariable value ; 默认值:none; 使用环境:**server,location,if** 该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。 示例:set$varname "hello world"; ``` location / { set $var1 "host is "; set $var2 $host; set $var3 " uri is $request_uri"; return 200 "response ok $var1$var2$var3"; } # 发送如下请求 # curl 127.0.0.1:8080/test # response ok host is 127.0.0.1 uri is /test ``` ``` ###default traderwork china set $tui_uri /trader-work/qa/v7.22.0/index.html; set $tui_host http://test.oss-cn-hangzhou.aliyuncs.com; set $tpui_host test.oss-cn-hangzhou.aliyuncs.com; ###out if ($geoip2_data_country_code != 'CN') { set $tui_uri /trader-work/qa1/v7.22.0/index.html; set $tui_host http://test.lwork.com; set $tpui_host test.lwork.com; } ``` 6.Uninitialized_variable_warn指令 语法:uninitialized_variable_warnon|off 使用环境:**http,server,location,if** 该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。 ### **rewrite规则实例** 1.允许和拒绝访问 ``` location ^~ /trace/ { allow 101.81.68.1; allow 10.172.0.0/16; allow 47.90.73.1; allow 120.25.125.1; allow 10.47.0.0/16; allow 47.89.29.1; deny all; proxy_set_header Host $host; proxy_set_header X-Origin-Scheme $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://qa_twfacade; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; } ```