Nginx使用rewrite重写url

作者: 温新

分类: 【Nginx】

阅读: 8593

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

作者:温新

时间:2021-03-02

rewrite语法

rewrite 	regex replacement	[flag];
# 关键字	  正则   替代内容		 flag标记

默认值:none

应用位置:server、location、if

flag标记有如下几个选项:

flag 含义
last 本条规则匹配完成后,继续向下匹配新的location url规则
break 本条规则匹配完成后立即终止,不再向后匹配任何规则
redirect 302临时重定向,浏览器地址会显示跳转后的url地址
permanent 301永久重定向,浏览器地址栏会显示跳转后的url地址

案例

# 将所有访问永久重定向到 www.ziruchu.com
rewrite ^/(.*) https://www.ziruchu.com permanent;

应用场景

1)url静态化,利于被搜索引擎收录,用户体验更好

2)网站域名更换

常用正则表达式

字符 含义
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或者多次
+ 匹配前面字符串一次或者多次
? 匹配前面字符串的零次或者一次
. 匹配除换行符 \n 之外的任何单字符
( ) 标记一个子表达式的开始和结束位置

其他指令

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。

if ($http_user_agent ~ MSIE) {
    # $http_user_agent的值中是否包含MSIE字符串,若有则返回true
}

4、-f或!-f判断请求文件是否存在

if (-f $request_filename) {
    # 判断请求文件是否存在
}

if (!-f $request_filename) {
    # 判断请求文件是否不存在
}

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块

案例:

server {
    location / {
        if ($slow) {
            set $id $s1;
            break;	# 中断 if 块之后的指令
            limit_rate 10k; # 该指令不会生效
        }
        # 此处,对于其他指令依旧生效
    }
}

return指令

语法:

# 方式一
return [text]
# 方式二
return code URL;
# 方式三
return URL;

功能:用于完成对请求的处理,直接向客户端返回响应状态代码。处于该指令后的所有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常用全局变量

变量 说明
$args 变量中存放请求URL中的请求指令。如a.com/a?a=1&b=2中的a=1&b=2的部分
$content_length 变量中存放请求头中的Content-length字段
$content_type 请求头中的Content-type字段
$document_root 当前请求的根路径
$document_uri 当前请求uri,如http://www.a.com/art?a=1中的/art
$host 请求url中的主机部分,https://www.zifuchu.com中的www.ziruchu.com
$http_user_agent 客户端的代理信息
$http_cookie 客户端的cookie信息
$limit_rate nginx服务器对网络连接速率的限制
$remote_addr 客户端IP
$remoet_port 客户端端口
$remote_user 客户端用户名
$request_body_file 本地文件资源名称
$request_method 请求方法,如GET、POST
$request_filename 当前请求的资源文件的路径名
$request_uri 当前请求uri并携带请求指令
$query_string 请求参数
$scheme 客户端请求协议,如http、https、ftp
$server_protocol 客户端请求协议版本,如http/1.0,http/1.1
$server_addr 服务器地址
$server_name 服务器名称
$server_port 服务器端口号
$uri 与$document_uri相同

rewrite重定向案例

将所有请求重定向到指定地址

rewrite ^/ https://www.ziruchu.com;

带路径重定向

server {
    listen 192.168.133.128:8080;
    location / {
        if ($host ~ :8080/demo01/) {
            rewrite ^(.*) https://www.test.com$1 permanent;
        }
    }
}

当案例中,当访问192.168.133.128:8080/demo01会重定向到https://www.test.com/demo01

url伪静态化

server {
    root /www/demo01;
    listen 192.168.133.128:8080;
    location ^~ /art {
        rewrite /art-(\d+)\.htm /art/$1.html permanent;
        break;
    }   
}

当访问192.168.133.128:8080/art-11.html时会重定向到192.168.133.128:8080/art/11.html

我是温新

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

请登录后再评论