Nginx rewrite模块

目录

  • 一、Nginx rewrite模块
    • 1、rewrite跳转场景
    • 2、rewrite跳转实现
    • 3、rewrite实际场景
    • 4、常用的正则表达式元字符
    • 5、rewrite 命令
    • 6、location 分类
    • 7、比较 rewrite 和 location
  • 二、示例验证
    • 1、基于客户端IP地址访问跳转(仅限指定IP地址)
    • 2、基于域名跳转(新的跳转旧的)
    • 3、基于旧域名跳转到新域名后面加目录
    • 4、基于参数匹配跳转(如:以100-(100|200)-100.html为结尾的网页跳转)
    • 5、基于目录下所有php结尾的文件跳转
    • 6、普通的一条url 请求跳转

一、Nginx rewrite模块

1、rewrite跳转场景

  • 使url看起来更规范,合理
  • 可将动态url地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上

2、rewrite跳转实现

  • ngx_http_rewrite_module模块:
    Nginx,支持url重写,if条件判断,但不支持else
    循环最多执行10次,超过10次后Nginx将返回500错误
    支持pcre(正则表达式)
    重写模块set指令

3、rewrite实际场景

  • Nginx跳转需求实现方式
    使用rewrite进行匹配跳转
    使用if匹配全局变量后跳转
    使用location 匹配再跳转
  • rewrite放在server{ } ,if { } ,location{ }段中
    location只对域名后边的除去传递参数外的字符串起作用
  • 对域名或参数字符串
    使用if 全局变量匹配
    使用proxy_pass反向代理

4、常用的正则表达式元字符

^    匹配起始位置
$    结束位置   
*     匹配前面的字符零次或多次
+    匹配前面的字符一次或多次
?     0次或1
.      任意单个字符
\      转译
\d    0-9数字
{n}    重复n次
{n.}    重复n次或多次
[c]     匹配单个字符c
[a-z]   匹配a-z小写任意一个
[a-zA-Z]      匹配a-z或A-Z任意一个

5、rewrite 命令

rewrite  正则<regex>   跳转后内容<replacement>   标记<flag>
  • 四个flag:
    last 表示完成rewrite ,一般写在server 和 if 中,不终止重写后的url匹配
    break 匹配完即终止,一般使用在location中,终止重写后的url
    redirect 返回302临时重定向
    permanent 返回301 永久重定向

6、location 分类

location = patt { }     精准匹配
location  patt { }     一般匹配
location ~ patt { }   正则匹配
  • 正则匹配常用表达式:
~        区分大小写 
~*       不区分大小写
!~       区分大小写的不匹配
!~*      不区分大小写不匹配
^~      使用前缀匹配,如果匹配成功则不再匹配其他
=         普通字符精确匹配,完全匹配
@        定义一个命名的location,使用在内部定向时
  • location优先级:
    相同类型的表达式,字符串长的优先匹配
    优先级排序
=   ^~  正则表达式(~~*)、前缀匹配  、通用匹配(/

7、比较 rewrite 和 location

  • 相同点:都能实现跳转
  • 不同点:rewrite 是在同一域名内更改获取资源的路径
    location 是对一类路径做控制访问或反向代理,还可以proxy_pass 到其他机器里
    rewrite会写在location里,执行吮吸
    执行server快里面的rewrite指令
    执行location匹配
    执行选定的location中的rewrite指令
  • location优先级规则

匹配某个具体文件:

`location=完整路径>location ^~ 完整路径>location ~* 完整路径>location ~ 完整路径>location 完整路径`>location /

用目录做匹配访问某个文件:

location=目录 > location ^~ 目录 > location ~ 目录 > location ~* 目录 > location 目录>location /

二、示例验证

1、基于客户端IP地址访问跳转(仅限指定IP地址)

  • 需求:某公司业务板块更新,现要求任何IP地址访问公司网站都会显示一个固定维护页面,只有公司IP:192.168.195.100 访问正常
yum -y install nginx
vim /etc/nginx/conf.d/default.conf
  listen  80;
  server_name  www.test.com;
  ......
  access_log /var/log/nginx/www.test.com-access_log main;
  set $rewrite true;
  if ($remote_addr = "192.168.195.100"){
    set $rewrite false;
  }
  if ($rewrite = true){
    rewrite (.+) /test.html;
  }
  location = /test.html {
    root /usr/share/nginx/html;
  }

Nginx rewrite模块_第1张图片
Nginx rewrite模块_第2张图片

Nginx rewrite模块_第3张图片
Nginx rewrite模块_第4张图片

2、基于域名跳转(新的跳转旧的)

  • 需求:某公司业务有变更,公司域名需要变更,要求将新域名跳转到旧域名上
yum -y install nginx
vim /etc/nginx/conf.d/defaule.con
listen 80;
server_name www.test.com;
......
access_log /var/log/nginx/www.test.com-access_log main;
location / {
  if ($host = 'www.test.com') {
    rewrite ^/(.*)$ http://www.newtest.com/$1 permanent;
  }
  root /usr/local/nginx/html;
  index index.html index.htm;
}

Nginx rewrite模块_第5张图片
Nginx rewrite模块_第6张图片

3、基于旧域名跳转到新域名后面加目录

  • 旧域名跳转到新域名上后面加目录,例如:访问http://bbs.test.com,现在将此域名上的内容跳转到http://www.test.com/bbs,注意保持域名跳转后的参数不变
yum -y install nginx
vim /etc/nginx/conf.d/defaule.con
listen 80;
server_name bbstest.com;
......
access_log /var/log/nginx/www.test.com-access_log main;
location /post {
  rewrite (.+) http://www/test.com/bbs$1 permanent;
}

修改DNS区域数据配置文件
[root@localhost ~]# vim /var/named/njit.com.zone 
bbs IN A       14.0.0.27
[root@localhost ~]# systemctl restart named

Nginx rewrite模块_第7张图片
Nginx rewrite模块_第8张图片

4、基于参数匹配跳转(如:以100-(100|200)-100.html为结尾的网页跳转)

yum -y install nginx
vim /etc/nginx/conf.d/defaule.con
listen 80;
server_name bbstest.com;
......
access_log /var/log/nginx/www.test.com-access_log main;
if ($request_uri ~ ^/100-(100|200)-(\d+).html$){
  rewrite (.*) http://www.test.com permanent;
}

Nginx rewrite模块_第9张图片
Nginx rewrite模块_第10张图片

5、基于目录下所有php结尾的文件跳转

yum -y install nginx
vim /etc/nginx/conf.d/defaule.con
listen 80;
server_name bbstest.com;
......
access_log /var/log/nginx/www.test.com-access_log main;
location ~* /upload/.*\.php$ {
  rewrite (.+) http://www.test.com permanent;
}

Nginx rewrite模块_第11张图片
Nginx rewrite模块_第12张图片

6、普通的一条url 请求跳转

yum -y install nginx
vim /etc/nginx/conf.d/defaule.con
listen 80;
server_name bbstest.com;
......
access_log /var/log/nginx/www.test.com-access_log main;
location ~* ^/1/txt.html {
  rewrite (.+) http://www.test.com permanent;
}

Nginx rewrite模块_第13张图片
Nginx rewrite模块_第14张图片

你可能感兴趣的:(Nginx rewrite模块)