Rewirte
一、什么是Nginx Rewrite
与Apache 等web服务软件一样,Nignx Rewrite的主要功能也是实现URL地址重写,Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。
二、Rewrite语法
指令语法:rewrite regex replacement[flag];
用用位置:server、location、if
rewrite 是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转:
rewrite ^/(.*) http://www.abc.com/$1 permanent; #rewrite 固定关键字 #regex部分是^/(.*) #这个正则表达式,匹配所有,匹配成功后跳转到http://www.abc.com/$1, #$1 取regex部分()里的内容,结尾permanent;表示永久301重定向标记
三、正则表达式
\ 将后面接着的字符标记为一个特殊字符或一个原意字符或一个向后引用。例如,"\n"匹配一个换行符,序列"\\"和"\$"则匹配"$"
^ 匹配输入字符串的其实位置,如果设置RegExp对象的Multiline属性,^也匹配"\n"或"\r"之后的位置
$ 匹配输入字符串的结束位置,如果设置了RegExp对象的Multiline属性,$也匹配"\n"或"\r"之前的位置
* 匹配前面的字符零次或多次,例如,ol*能匹配"o"及"olll",*等价于{0,}
+ 匹配前面的字符一次货多次 等价于{1,}
? 匹配前面的字符零次或一次,例如,"do(es)?"可以匹配"do"或"does"中的"do" .?等价于{0,1}
当该字符紧跟在任何一个其他限制符(*,+?,{n},{n,m})后面时,匹配模式是贪婪模式的,非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串,例如,对于字符串"ooooo","o+?"将匹配单个"o",而"o+"将匹配所有"o"
. 匹配除"\n"之外的任何单个字符,要匹配包括"\n"在内的任何字符,使用像"[.\n]"的模式
(pattern) 匹配括号内pattern并可以在后面获取对应的匹配,常用$0....$9属性获取小括号中的匹配内容。要匹配圆括号字符,使用"\("或"\)"
四、rewrite 指令中的flag
last 本条规则匹配完成后,继续向下匹配新的location URI规则;
break 本条规则匹配完成即终止,不在匹配后面的任何规则;
redirect 返回302临时重定向,浏览器地址栏会显示跳转后的URL地址;
permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏URL地址不变,但在服务器端访问的程序及路径发生了变化。Redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完后,会对其所在的server{....}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配,不再匹配后面的规则。
五、Rewrite企业应用场景
server { listen 80; server_name abc.com; rewrite ^/(.*) http://www.abc.com/$1 permanent; #当前用户访问abc.com及下面的任意内容时,都会通过这条Rewrite跳转到www.abc.com对应的地址 } server{ listen 80; server_name www.abc.com; location / { root html/www; index index.html index.htm; } access_log logs/access_www.log main gzip buffer=32k flush=5s; }
server { listen 80; server_name blog.abc.com; location / { root html/blog; index index.html index.htm; } if ($http_host ~* "^(.*)\.abc\.com$") { set $domain $1; rewrite ^(.*) http://www.abc.com/$domain/abc.html break; } }
server { listen 80; server_name www.abc.com abc.com location / { root html/www; index index.html index.htm; } rewrite ^(.*)/bbs/ http://bbs.abc.com break; #加入有/bbs中跳转到bbs.abc.com }
浙公网安备 33010602011771号