Nginx Rewrite 的实现

一:Nginx Rewrite概述

1.1:案例前置知识点

  • Rewrite跳转场景Rewrite跳转场景主要包括以下几种:
  1. 可以调整用户浏览的URL,2. 看起来更规范,3. 合乎开发及产品人员的需求。
  • 为了让搜索引擎搜录网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务。
  • 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com。
  • 根据特殊变量、目录、客户端的信息进行URL调整等。

1.2:Rewrite跳转实现

  • Nginx是通过ngx_http_rewrite_module模块支持url重写、支持if条件判断,但不支持else。
  • 另外该模块需要PCRE支持,应在编译Nginx时指定PCRE 支持,默认已经安装。根据相关变量重定向和选择不同的配置,从一个location跳转到另一个location,不过这样的循环最多可以执行10次,超过后Nginx将返回500错误。同时,重写模块包含set指令,来创建新的变量并设其值,这在有些情景下非常有用的,如记录条件标识、传递参数到其他location、记录做了什么等等。
  • rewrite功能就是,使用Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。
    在这里插入图片描述

1.3:Rewrite实际场景

  1. 在实际工作场景,Nginx跳转需求有三种方式可实现。
  • 直接用rewrite进行匹配跳转
  • 使用if 匹配全局变量后跳转
  • 使用location匹配再跳转
  1. rewrite只能放在server{},if{},location{}段中
  • location只能对域名后边的除去传递的参数外的字符串起作用,例http://www.domain.com/index.php?id=1只对/index.php重写。
  1. 对域名或参数字符串
  • 使用if全局变量匹配
  • 使用proxy_pass反向代理

1.4:常用的正则表达式元字符

在这里插入图片描述

1.5:Rewrite 语法

  • Rewrite命令的语法如下所示:
    rewrite [flag];
    regex:正则
    replacement:跳转后的内容
    flag: rewrite支持的flag标记

  • flag标记说明:
    last:相当于Apache的[L]标记,表示完成 rewrite。
    break:本条规则匹配完成即终止,不再匹配后面的任何规则。
    redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url(因为是临时)。
    permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url。

  • 如果后面不跟flag标记,那么默认是302临时重定向。在实际工作场景中,还有另一种return指定。因为301和302不能简单的只返回状态码,还必须有重定向的URL,这就是return指令无法返回301,302的原因了。last和break区别有点难以理解。

  • last一般写在server和if中,而break一般使用在location中。last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配

1.6:Location分类

  • location大致可以分为三类:
  1. location = patt {} [精准匹配]
  2. location patt {} [一般匹配]
  3. location ~ patt {} [正则匹配]
  • 精准匹配和一般匹配不需要做详细的说明,主要是正则匹配,下面就是正则匹配的一些表达式,需要多加牢记
  1. ~ 表示执行一个正则匹配,区分大小写。
  2. ~* 表示执行一个正则匹配,不区分大小写。
  3. !~ 表示执行一个正则匹配,区分大小写不匹配
  4. !~* 表示执行一个正则匹配,不区分大小写不匹配。
  5. ^~ 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其他location。
  6. = 进行曾通字符精确匹配。也就是完全匹配。
  7. @ 它定义一个命名的location,使用在内部定向时,例如error_page

1.7:Location优先级

  • 在Nginx的location和配置中location的顺序没有太大关系。和location表达式的类型
    有关,相同类型的表达式,字符串长的会优先匹配。

以下是按优先级排列说明:

  1. 等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项。
  2. ~类型表达式。一旦匹配成功,则不再查找其他匹配项。
  3. 正则表达式类型(和*)的优先级次之。
  4. 常规字符串匹配类型。按前缀匹配。
  5. 通用匹配(/),如果没有其它匹配,任何请求都会匹配到。
  • 从功能看rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同
    一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以
    proxy_pass到其他机器。很多情况下rewrite也会写在location里,它们的执行顺序是:
  1. 执行server块里面的rewrite指令。
  2. 执行location匹配。
  3. 执行选定的location中的rewrite指令。

二:实验操作

2.1:环境要求

  • 在真机windows10中做一下hosts映射,将虚拟机对应的地址对应www.51xit.top和www.52xit.top

2.2:实验一

基于域名的跳转,现在公司旧域名www.51xit.top有业务需求的变更,需要使用新域名www.52xit.top代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数不变
vi /usr/local/nginx/conf/nginx.conf
找到文档中的这一段
location / {
           # root   html;
           # index  index.html index.htm;
if ($host = 'www.51xit.top'){
rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
}
         }
if ($host = 'www.51xit.top'){
rewrite ^/(.*)$ http://www.52xit.top/$1 permanent;
}
systemctl restart nginx.service 
然后用谷歌测试一下,在谷歌中输入www.51xit.top,他会跳转到www.52xit.top

2.3:实验二

基于客户段ip访问跳转,例如今天公司的业务版本上线,所有的ip访问任何内容都显示一个固定的维护页面,只有公司ip访问正常
vi /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.51xit.top;   改一下域名
 charset utf-8;      改字符集
 access_log  /usr/local/nginx/logs/www.51xit.top.access.log;  改日志储存路径,去掉mail
#      set $rewrite true;       
#       if ($remote_addr = '20.0.0.12'){     客户机真机的位置
#      set $rewrite false;      
#       }
#       if ($rewrite = true){
#       rewrite (.+) /wh.html;       跳转到wh.html 页面
#       }
#       location = /wh.html {
#       root /usr/local/nginx/html/;      wh.html存放的路径 
#       }
systemctl restart nginx.service
 cd  /usr/local/nginx/html/
cp index.html wh.html
vi wh.html     进去编辑个测试页

在这里插入图片描述

  • 最后在谷歌中输入20.0.0.12,页面显示维护中,如果想实现另外的功能,在开一台虚拟机测试

2.4:实验三

基于旧域名跳转到新域名后面加目录,例如现在访问的是http://ww.51xit.top/post/,
现在需要将这个域名下面的发帖都跳转到http://www.52xit.top/bbs,注意保持域名跳转
后的参数不变。
vi /usr/local/nginx/conf/nginx.conf
#         location /post {
#       rewrite (.+) http://www.52xit.top/bbs$1 permanent;
#}
systemctl restart nginx.service 
最后用谷歌输入http://ww.51xit.top/post  页面显示http://www.52xit.top/bbs

2.5:实验四

基于参数匹配的跳转,例如现在访问
http://www.51xit.top/100-(100[200)-100.html跳转到http://www.51xit.top页面。
vi /usr/local/nginx/conf/nginx.conf
 if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
 #      rewrite (.*) http://www.52xit.top permanent;
#}
systemctl restart nginx.service 
最后在谷歌中输入systemctl restart nginx.service  页面显示http://www.51xit.top

2.6:实验五

基于目录下所有php结尾的文件跳转,访问http://www.51xit.top/upload/1.php
跳转到首页
vi /usr/local/nginx/conf/nginx.conf
#       location ~* /upload/.*\.php$ {
#        rewrite (.*) http://www.51xit.top permanent;
#}
systemctl restart nginx.service
最后在谷歌中输入http://www.51xit.top/upload/1.php 页面显示www.51xit.top 

2.7:实验六

基于最普通一条url请求的跳转,访问一个具体的页面跳转到首页
vi /usr/local/nginx/conf/nginx.conf
        location ~* ^/1/test.html {
        rewrite (.*) http://www.51xit.top permanent;
}
systemctl restart nginx.service
谷歌中输入http://www.51xit.top/upload/1.php  页面显示www.51xit.top 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值