Nginx使用rewrite重写url
作者:温新
时间:2021-03-02
rewrite语法
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">rewrite</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">regex replacement</span> [flag];</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 关键字 正则 替代内容 flag标记</span></span>
默认值:none
应用位置:server、location、if
flag标记有如下几个选项:
案例
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 将所有访问永久重定向到 www.ziruchu.com</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">rewrite</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">^</span>/<span style="box-sizing: border-box;color: rgb(17, 119, 0)">(</span>.*<span style="box-sizing: border-box;color: rgb(17, 119, 0)">)</span> https://www.ziruchu.<span style="box-sizing: border-box;color: rgb(17, 119, 0)">com permanent</span>;</span>
应用场景
1)url静态化,利于被搜索引擎收录,用户体验更好
2)网站域名更换
常用正则表达式
其他指令
if指令
语法:if ( condition ) {}
功能:条件判断。
参数:condition判断条件为 true/false。condition有如下几个判断条件:
1、变量名。若变量值为空字符串或以“0”开头的任意字符,if指令默认为false;
if ($name) { }
2、=或!=比较变量和字符串是否相等,相等为true,否则为false
if ($request_method == POST) { }
注意:字符串(POST)不需要加引号
3、使用正则对变量进行匹配,成功为true,否则为false
变量与正则表达式之间使用~、~*、!~、!~*
连接。~
表示大小写敏感,~*
大小写不敏感,!~/~!~*
匹配失败时为true,否则为false。
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">if</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">($http_user_agent ~</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">MSIE)</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># $http_user_agent的值中是否包含MSIE字符串,若有则返回true</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
4、-f或!-f判断请求文件是否存在
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">if</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">(-f</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">$request_filename)</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 判断请求文件是否存在</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box"></span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">if</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">(</span><span style="box-sizing: border-box;color: rgb(119, 0, 136)">!</span><span style="box-sizing: border-box;color: rgb(17, 119, 0)">-f</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">$request_filename)</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 判断请求文件是否不存在</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
5、-d或!-d 判断请求的目录是否存在
为-d
时,请求为目录,返回true,否则为false;
为!-d
时,若请求的目录不存在,但该目录存在上级目录,返回true;若该目录和上级目录都不存在,返回false;若请求的目录存在,返回false。
6、-e 或 !-e 判断文件或目录是否存在
为-e
时,若请求的目录或文件存在,则返回true,否则为false;
为!-e
时,若请求的文件和所在路径上的目录都不存在,返回true,否则返回false。
7、-x 或 !-x 判断文件是否可执行
为-x
时,若请求文件可执行,返回true;
为!-x
时,若请求文件不可执行,返回true。
break指令
语法:break
功能:结束该层的匹配
使用范围:使用在server块和location块以及if块
案例:
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">server</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">location</span> / {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">if</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">($slow)</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">set</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">$id </span>$s1;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">break</span>; <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 中断 if 块之后的指令</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">limit_rate</span> 10k; <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 该指令不会生效</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 此处,对于其他指令依旧生效</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
return指令
语法:
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 方式一</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> [text]</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 方式二</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> <span style="box-sizing: border-box;color: rgb(17, 119, 0)">code URL</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(170, 85, 0)"># 方式三</span></span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(119, 0, 136)">return</span> URL;</span>
功能:用于完成对请求的处理,直接向客户端返回响应状态代码。处于该指令后的所有nginx配置都是无效的。
使用范围:server location if
参数:
text,返回给客户端的内容;
code,返回给客户端HTTP状态码;
URL,返回客户端的url地址。
rewrite_log
语法:rewrite_log on | off
功能:是否开启URL重写日志的输出功能。默认为off。
说明:URL重写的相关日志将以notice级别输出到error_log指令配置的日志文件中。
set
语法:set $variable value
功能:用于设置一个新变量
参数:
variable,为变量名;
value:变量值
案例:set $age 19
uninitialized_variable_warn
语法:uninitialized_variable_warn on | off
功能:用于设置配置使用未初始化的变量时,是否记录警告日志。默认为on。
rewrite常用全局变量
rewrite重定向案例
将所有请求重定向到指定地址
rewrite ^/ https://www.ziruchu.com;
带路径重定向
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">server</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(255, 85, 0)">listen</span> 192.168.133.128:8080;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">location</span> / {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">if</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">($host ~</span> :8080/demo01/<span style="box-sizing: border-box;color: rgb(17, 102, 68)">)</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">rewrite</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">^(</span>.*<span style="box-sizing: border-box;color: rgb(17, 102, 68)">)</span> https://www.test.<span style="box-sizing: border-box;color: rgb(17, 102, 68)">com$1 permanent</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> }</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
当案例中,当访问192.168.133.128:8080/demo01
会重定向到https://www.test.com/demo01
url伪静态化
<span style="box-sizing: border-box;padding-right: 0.1px"><span style="box-sizing: border-box;color: rgb(0, 85, 170)">server</span> {</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(255, 85, 0)">root</span> /www/demo01;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(255, 85, 0)">listen</span> 192.168.133.128:8080;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(0, 85, 170)">location</span> <span style="box-sizing: border-box;color: rgb(17, 102, 68)">^~</span> /<span style="box-sizing: border-box;color: rgb(17, 102, 68)">art </span>{</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">rewrite</span> /<span style="box-sizing: border-box;color: rgb(17, 102, 68)">art-(\d</span>+<span style="box-sizing: border-box;color: rgb(17, 102, 68)">)\</span>.<span style="box-sizing: border-box;color: rgb(17, 102, 68)">htm </span>/art/$1.<span style="box-sizing: border-box;color: rgb(17, 102, 68)">html permanent</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> <span style="box-sizing: border-box;color: rgb(119, 0, 136)">break</span>;</span><br></br><span style="box-sizing: border-box;padding-right: 0.1px"> } </span><br></br><span style="box-sizing: border-box;padding-right: 0.1px">}</span>
当访问192.168.133.128:8080/art-11.html
时会重定向到192.168.133.128:8080/art/11.html
我是温新
每天进步一点点,就一点点