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