Nginx Rewirte关键指令详解和配置
原创
©著作权归作者所有:来自51CTO博客作者lww_51CTO的原创作品,请联系作者获取转载授权,否则将追究法律责任
Rewirte介绍
Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perlcompatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,类似网络中的重定向
应用场景:
- URL看起来更规范、合理
- 企业会将动态URL地址伪装成静态地址提供服务
- 网址换新域名后,让旧的访问跳转到新的域名.上
- 服务端某些业务调整
- 常见搭配location、rewrite & if
ngx_http_rewrite_module 模块指令
关键指令rewrite(flag跳转redirect、permanent、代理break、last )
辅助指令if、set、break、return、
rewrite指令(关键指令)
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理,rewrite可以配置在 server、location、if
语法格式
rewrite regex replacement [flag];
正则表达式
. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字
\b #匹配单词的开始或结束
^ #匹配字付串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
(n) #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^magedu] #匹配除了magedu 这几个字母以外的任意字符
rewrite flag使用
利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型
- 跳转型指由客户端浏览器重新对新地址进行请求
- 代理型是在WEB服务器内部实现跳转
rewrite 格式
Syntax: rewrite regex replacement [flag]; #通过正则表达式处理用户请求并返回替换后的数据包。
Default: —
Context: server, location, if
flag 说明
redirect;
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;
#使用相对路径,或者http://或https://开头,状态码:302
permanent;
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301
break;
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;
#结束循环,建议在location中使用,适用于一个URL一次重写
last;
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,
#不建议在location中使用,适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户
案例实验前准备文件
rewrite案例: 域名永久与临时重定向
应用场景
域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。跳转是从客户端面多次执行,安全性较差可减少服务器压力
执行过程
配置信息
server {
listen 80;
server_name mobile.linweiwei.com;
location / {
root /etc/nginx/html/mobile;
rewrite / https://www.jd.com/ redirect; #临时重定向
#rewrite / https://www.jd.com/ permanent; #临时重定向
}
}
#重启Nginx并访问域名 mobile.linweiwei.com 进行临时重定向测试
测试结果(如果做实验永久重定向301,测试后记得清理浏览器缓存)
rewrite案例: break 与 last
break适用于不改变客户端访问方式,但是要将访问的目的URL做单次重写的场景,比如:有V1/V2两个版本的网站前端页面并存,旧版本的网站数据在statics,当前还不能丢失,但是要将访问新版本的请求重写到新的静态资源路径static
配置信息
server {
listen 80;
server_name pc.linweiwei.com;
root /etc/nginx/html/pc;
location / {
root /etc/nginx/html/pc;
}
location /test1 {
rewrite ^(.*) /test2/$1;
}
location /test2 {
default_type text/plain;
return 666 "this is test2";
}
}
测试结果
last:对某个location的URL匹配成功后,会停止当前location的后续rewrite规则,并结束当前location,然后将匹配生成的新URL跳转至其他location继续匹配,直到没有location可匹配后, 将最后一次location的数据返回给客户端。last 适用于要不改变客户端访问方式但是需做多次目的URL重写的场景,使用场景不是很多