rewrite命令使用正则表达式来匹配请求URI,被匹配到的URI将会被重写,能够实现内部URL重写或URL重定向。rewrite命令可以出如今server、location、if语句块中。多个rewrite语句按照它们在配置文件中出现的位置从上往下顺序执行,匹配到某一条rewrite语句后是否会继续向下执行或后续如何处理,由那条语句决定。html
命令语法格式:nginx
rewrite 正则表达式 新URI [flag];正则表达式 |
"正则表达式"用于匹配"请求URI",匹配到的URI将会被替换成"新URI"。vim
"新URI"能够是单纯的URI,也能够是一个完整的URL地址:浏览器
当"新URI"是单纯的URI时,称做内部URL重写。此时本条rewrite语句会按照规则将请求URL重写成新的URL,但重写完成后的行为则受 [flag] 选项控制。网络
当"新URI"是一个完整的URL地址,即以"http://"、"https://"或"$scheme"开头的地址时,称做URL重定向。此时本条rewrite规则重写完成后,服务端再也不进行进一步处理,它会马上将获得的新URL返回给客户端(30一、302等重定向的形式),服务端处理完成,客户端则会从新发起对新URL的请求。ide
[flag] 选项用于调控重写的行为,它的取值多是:测试
last:重写完成后,会中止继续处理当前区块全部属于ngx_http_rewrite_module模块的语句(即不会继续匹配当前区块余下的rewrite语句或其它属于该模块的语句)。重写获得的新URL会从新匹配全部location语句,以进行进一步处理。spa
break:重写完成后,会中止继续处理当前区块全部属于ngx_http_rewrite_module模块的语句(即不会继续匹配当前区块余下的rewrite语句或其它属于该模块的语句),就像break命令同样,不会有进一步的动做。server
redirect:重写完成后,返回带有302代码(临时重定向)的新URL给客户端,服务端处理完成。该flag只有在"新URI"不是完整的URL地址时才会生效。
permanent:重写完成后,返回带有301代码(永久重定向)的新URL给客户端,服务端处理完成。
示例:
先在网页根目录下建立一些目录和文件用于后续测试。
[root@gw ~]# mkdir -p /usr/local/nginx/html/dir/subdir1 [root@gw ~]# mkdir -p /usr/local/nginx/html/dir/subdir2 [root@gw ~]# echo 'subdir1 testfile.html' > /usr/local/nginx/html/dir/subdir1/testfile.html [root@gw ~]# echo 'subdir2 testfile.html' > /usr/local/nginx/html/dir/subdir2/testfile.html |
修改nginx配置文件,定义rewrite规则,能够在server语句块中定义。
[root@gw ~]# vim /usr/local/nginx/conf/nginx.conf server { rewrite ^/dir/(.*)/.*$ /dir/$1/testfile.html break; } |
上面rewrite规则的含义是:若请求URI符合^/dir/(.*)/.*$,则将其重写为/dir/$1/testfile.html。$1是引用请求URI中第一个括号括起来的内容,$二、$3等相似(若是有的话)。这样,当请求是http://172.16.111.114/dir/subdir1/whaterver这种时,它将变成访问/dir/subdir1/testfile.html;若请求是http://172.16.111.114/dir/subdir2/whaterver时,它将访问/dir/subdir2/testfile.html这个文件。以下所示:
打开浏览器,按下F12键,切换到网络选项卡,再在浏览器地址栏中输入要访问的URL地址,就能够看到是否有URL重写或重定向: