Rewirte介绍

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perlcompatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,类似网络中的重定向

应用场景:

  1. URL看起来更规范、合理
  2. 企业会将动态URL地址伪装成静态地址提供服务
  3. 网址换新域名后,让旧的访问跳转到新的域名.上
  4. 服务端某些业务调整
  5. 常见搭配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重写后返回错误的给用户

案例实验前准备文件

Nginx Rewirte关键指令详解和配置_客户端

rewrite案例: 域名永久与临时重定向

应用场景

域名的临时的调整,后期可能会变,之前的域名或者URL可能还用、或者跳转的目的域名和URL还会跳转,这种情况浏览器不会缓存跳转,临时重定向不会缓存域名解析记录(A记录),但是永久重定向会缓存。跳转是从客户端面多次执行,安全性较差可减少服务器压力

执行过程

Nginx Rewirte关键指令详解和配置_客户端_02

配置信息

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,测试后记得清理浏览器缓存)

Nginx Rewirte关键指令详解和配置_重定向_03

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";
}
}

测试结果

Nginx Rewirte关键指令详解和配置_重定向_04

last:对某个location的URL匹配成功后,会停止当前location的后续rewrite规则,并结束当前location,然后将匹配生成的新URL跳转至其他location继续匹配,直到没有location可匹配后, 将最后一次location的数据返回给客户端。last 适用于要不改变客户端访问方式但是需做多次目的URL重写的场景,使用场景不是很多