Rewrite
模块(模块名:ngx_http_rewrite_module
)的主要功能是实现 URL
的重写,其规则采用 PCRE
正则表达式。Rewrite
模块是 Nginx
标准模块,默认已安装。
rewrite
是实现 URL 重写的关键指令。这个指令根据正则表达式和待替换的字符串来更改 URL
。语法如下:
rewrite regex replacement flag;
Nginx 根据指令的 regex
(正则表达式)匹配 URI;replacement
是一个字符串,它用于替换 URI 中被截取的内容,匹配成功后会重定向到这个 URI;结尾是 flag
标记,它设置 rewrite
对 URI 的处理行为。
常用的 flag 如下:
示例:
# 部分配置内容已省略
# ...
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 (condition) {
# ...
}
可以指定的条件有很多,这里我们介绍几个常用的:
示例:
# 部分配置内容已省略
#...
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
使用的 flag
为 break
,它一旦匹配完成就不会继续进行 rewrite
,而这里我们还需要继续执行 rewrite
,因此使用 last
。第二个 rewrite
中,我们使用了 permanent
这个 flag
,它会改变浏览器的地址为重定向之后的地址。
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
指令的作用是完成当前的规则集匹配,不再处理 rewrite
指令。语法如下:
break;