Nginx Rewrite 规则

文章目录

  • 一、简介
  • 二、rewrite 指令
  • 三、if 指令
  • 四、return 指令
  • 五、break 指令

一、简介

Rewrite 模块(模块名:ngx_http_rewrite_module)的主要功能是实现 URL 的重写,其规则采用 PCRE 正则表达式。Rewrite 模块是 Nginx 标准模块,默认已安装。

二、rewrite 指令

rewrite 是实现 URL 重写的关键指令。这个指令根据正则表达式和待替换的字符串来更改 URL。语法如下:

rewrite regex replacement flag;

Nginx 根据指令的 regex(正则表达式)匹配 URI;replacement 是一个字符串,它用于替换 URI 中被截取的内容,匹配成功后会重定向到这个 URI;结尾是 flag 标记,它设置 rewrite 对 URI 的处理行为。

常用的 flag 如下:

  • last : 本条规则匹配完成后,继续向下匹配新的 location URI 规则;
  • break : 本规则匹配完成后,终止匹配,不再匹配后面的规则;
  • redirect : 返回 302 临时重定向,地址栏会显示跳转后的地址;
  • permanent : 返回 301 永久重定向,地址栏会显示跳转后的地址。

示例:

# 部分配置内容已省略
# ...
http {
#    ...
#   下面是要添加的内容
    server {
        # 监听本机 81 端口
        listen 81;

        # 设置重写规则
        rewrite ^/(.*) https://www.liuli.host/$1 last;
    }
}

这里 rewrite ^/(.*) https://www.liuli.host/$1 last; 的作用是将我们输入的 URL 中 / 其后的内容添加到 https://www.liuli.host/ 后面。

^/ 表示匹配字符串的起始位置是 /,以括号包围起来的部分 (.*) 是可以在替换字符串 replacement 中获取到的(匹配到的第一个结果为 $1),匹配的内容是 .*,它表示匹配任意多个单字符。

比如:我们输入 localhost:81/faq,那么重写后的 URL 就是 https://www.liuli.host//faq
last 表明这个 rewrite 规则匹配完成,由于后面没有 location URI 规则,其作用和 break 相同。

三、if 指令

if 指令用于检查一个条件是否符合,如果符合条件,则执行花括号内的语句。语法如下:

if (condition) { 
#    ... 
}

可以指定的条件有很多,这里我们介绍几个常用的:

  • -e 和 !-e:分别表示判断文件或目录存在和不存在
  • ~:表示区分大小写字母的匹配
  • ~*:表示不区分大小写字母的匹配

示例:

# 部分配置内容已省略
#...
http {
#   ...
    server {
        listen 81;
        root /usr/share/nginx/html;
        # location 也可以使用正则表达式
        # 这里的含义是:区分大小写匹配以 /liuli 开头,后跟任意多个单字符的 URI
        location ~ /liuli.* {
            rewrite "^/liuli([0-9]{3})" /liuli/$1 last;
            # $request_filename 是 Nginx 内置的变量
            # 表示请求的路径或文件
            if (!-e $request_filename) {
                rewrite ^/(.*)$ /index.html permanent;
            }
        }
    }
}

请求的 URI 被重写之后又会在 if 指令中判断,如果请求的路径或者文件存在,那么就直接访问,相反,会被重定向到 /index.html

要注意,刚刚我们在第一个 rewrite 使用的 flagbreak,它一旦匹配完成就不会继续进行 rewrite,而这里我们还需要继续执行 rewrite,因此使用 last。第二个 rewrite 中,我们使用了 permanent 这个 flag,它会改变浏览器的地址为重定向之后的地址。

四、return 指令

return 指令根据规则的执行情况,返回一个状态值给客户端。语法如下:

return code;

code 可以使用值包括:204,400,402 - 406,408,410,411,413,416 及 500 - 504。也可以发送非标准的 444 代码(未发送任何头信息),然后结束连接。

我们修改配置文件,使得客户端访问 /test 目录时,服务器返回 403 Forbidden。配置文件的内容如下:

# 部分配置内容已省略
#...
http {
#   ...
    server {
        listen 81;
        root /usr/share/nginx/html;
        location = /test {
            return 403;
        }
    }
}
#...

五、break 指令

break 指令的作用是完成当前的规则集匹配,不再处理 rewrite 指令。语法如下:

break;

你可能感兴趣的:(Nginx)