Nginx使用rewrite重写url

作者: 温新

分类: 【Nginx】

阅读: 8306

时间: 2021-10-01 13:05:27

作者:温新

时间: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

我是温新

每天进步一点点,就一点点

请登录后再评论