Nginx rewrite正则匹配重写的方法示例
Nginx的rewrite功能支持正则匹配重写,即将URL地址临时或永久重新指向某个新的位置,类似于重定向。这个特性有利用当网站结构做出重大调整,如之前的网站mp3资源使用URL为www.site1.org/mp3进行访问,而现在服务器上mp3目录已经被使用music目录替换,那rewrite这个功能则能够轻松实现。其次如可以将site1.org强制调整到www.site1.org,反之亦可。这个指令位于ngx_http_rewrite_module模块。本文主要描述这个指令的用法并给出演示。
一、rewrite指令语法描述
句法:rewriteregexreplacement[flag];
默认:-
语境:server,location,if
如果指定的正则表达式与请求URI匹配,则URI将按照replacement字符串中的指定进行更改。
该rewrite指令在其在配置文件中出现的顺序顺序地执行。可以使用标志终止对伪指令的进一步处理。
如果替换字符串以“http://”,“https://”或“$scheme”开头,则处理停止,并将重定向返回给客户端。
flag标志的作用是用于控制当匹配到对应的rewrite规则后是否继续检查后续的rewrite规则
可选flag参数可以是以下之一:
last
一旦被当前规则匹配并重写后立即停止检查后续的其它rewrite的规则,而后通过重写后的规则重新发起请求;
break
一旦被当前规则匹配并重写后立即停止后续的其它rewrite的规则,而后继续由nginx进行后续操作;
redirect
如果替换字符串不以“http://”,“https://”或“$scheme”开头,则使用,返回302临时重定向;
permanent
返回301永久重定向;
注意:一般将rewrite写在location中时都使用break标志,或者将rewrite写在if上下文中;
其他指令
rewrite_logon|off
是否把重写过程记录在错误日志中;默认为notice级别;默认为off;
returncode:
用于结束rewrite规则,并且为客户返回状态码;可以使用的状态码有204,400,402-406,500-504等;
二、基于location上下文rewrite功能演示
本机环境
#more/etc/redhat-release
CentOSLinuxrelease7.2.1511(Core)
#nginx-v
nginxversion:nginx/1.12.2
配置nginx
#vim/etc/nginx/conf.d/rewrite.conf
server{
listen80;
server_namesite1.oragwww.site1.org;
location/{
root/www/site1.org;
indexindex.htmlindex.htm;
}
}
#mkdir-pv/www/site1.org/images
#echo"Thisisarewritetestpage.">/www/site1.org/index.html
#cp/usr/share/backgrounds/gnome/*.jpg/www/site1.org/images/
#vim/etc/hosts
192.168.1.175site1.org
192.168.1.175www.site1.org
#curlhttp://www.site1.org
Thisisarewritetestpage.
#curl-Ihttp://www.site1.org/images/Waves.jpg
HTTP/1.1200OK
Server:nginx/1.12.2
Date:Wed,01Nov201703:47:58GMT
Content-Type:image/jpeg
Content-Length:458818
Last-Modified:Wed,01Nov201703:43:48GMT
Connection:keep-alive
ETag:"59f942f4-70042"
Accept-Ranges:bytes
修改rewrite.conf文件,添加rewrite指令
location/{
root/www/site1.org;
indexindex.htmlindex.htm;
rewrite^/images/(.*)$/imgs/$1last;
}
#systemctlreloadnginx
#curl-Ihttp://www.site1.org/images/Waves.jpg
HTTP/1.1404NotFound
Server:nginx/1.12.2
Date:Wed,01Nov201704:02:38GMT
Content-Type:text/html
Content-Length:169
Connection:keep-alive
#mkdir-pv/www/site1.org/imgs
#mv/www/site1.org/images/Waves.jpg/www/site1.org/imgs/.
#curl-Ihttp://www.site1.org/images/Waves.jpg
HTTP/1.1200OK
Server:nginx/1.12.2
Date:Wed,01Nov201704:05:07GMT
Content-Type:image/jpeg
Content-Length:458818
Last-Modified:Wed,01Nov201703:43:48GMT
Connection:keep-alive
ETag:"59f942f4-70042"
Accept-Ranges:bytes
#curl-Ihttp://www.site1.org/imgs/Waves.jpg##这种方式可以访问
HTTP/1.1200OK
Server:nginx/1.12.2
Date:Wed,01Nov201704:06:17GMT
Content-Type:image/jpeg
Content-Length:458818
Last-Modified:Wed,01Nov201703:43:48GMT
Connection:keep-alive
ETag:"59f942f4-70042"
Accept-Ranges:bytes
模拟rewrite导致的http500错误
再次对rewrite.conf文件做如下修改,
location/{
root/www/site1.org;
indexindex.htmlindex.htm;
rewrite^/images/(.*)$/imgs/$1last;
rewrite^/imgs/(.*)$/images/$1;
}
#systemctlrestartnginx
#curl-Ihttp://www.site1.org/imgs/Waves.jpg
HTTP/1.1500InternalServerError
Server:nginx/1.12.2
Date:Wed,01Nov201705:23:16GMT
Content-Type:text/html
Content-Length:193
Connection:close
#curl-Ihttp://www.site1.org/images/Waves.jpg
HTTP/1.1500InternalServerError
Server:nginx/1.12.2
Date:Wed,01Nov201705:23:28GMT
Content-Type:text/html
Content-Length:193
Connection:close
通过上述的测试可知,出现了死循环导致的500错误。
Nginx官方给出的参考样例:
server{
...##rewrite指令位于server上下文
rewrite^(/download/.*)/media/(.*)\..*$$1/mp3/$2.mp3last;
##将/download目录中包含media目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3
rewrite^(/download/.*)/audio/(.*)\..*$$1/mp3/$2.ralast;
##将/download目录中包含audio目录下的任意文件请求重定向为donwload/任意/mp3/任意.mp3
return403;
...
}
location/download/{##rewrite指令位于location上下文
rewrite^(/download/.*)/media/(.*)\..*$$1/mp3/$2.mp3break;
##该last标志应该被替换break,否则nginx将使10个周期返回500个错误
rewrite^(/download/.*)/audio/(.*)\..*$$1/mp3/$2.rabreak;
return403;
}
三、基于if条件判断rewrite功能演示
#vi/etc/nginx/conf.d/rewrite.conf
server{
listen80;
server_namesite1.oragwww.site1.org;
if($host!='www.site1.org'){
rewrite^/(.*)$http://www.site1.org/$1permanent;
}
location/{##Author:Leshami
root/www/site1.org;##Blog:http://blog.csdn.net/leshami
indexindex.htmlindex.htm;
rewrite^/images/(.*)$/imgs/$1last;
rewrite^/imgs/(.*)$/images/$1;
}
}
#systemctlreloadnginx.service
本地测试(修改本地host文件)
#curlhttp://site1.org
##返回301状态码
301MovedPermanently
301MovedPermanently
nginx/1.12.2