11-Nginx_Rewrite重写

1、Rewrite基本概述

(1) 什么是rewrite

Rewrite 主要实现url地址重写,以及重定向,就是把传入Web请求重定向到其他URL的过程

(2) Rewrite使用场景
    1、地址转换:用户访问www.zxc.com这个URL时,将其定向至一个新的域名www.baidu.com
    2、协议跳转:用户通过http协议请求网站时,将其重新跳转至https协议方式
    3、搜索引擎:SEO优化依赖于URL路径,好记的URL便于支持搜索引擎录入
    4、伪静态:将动态页面显示为静态页面方式的一种技术,便于搜索引擎的录入,同时减少动态URL地址对外暴露过多的参数,提升更高的安全性。
(3)  Rewrite配置示例
 Syntax:  rewrite regex replacement [flag];
 Default: —
 Context: server, location, if
    
#用于切换维护页面场景
#rewrite ^(.*)$ /page/maintain.html break;

2、Rewrite标记Flag

rewrite指令根据表达式来重定向URL ,或者修改字符串。可以应用于server, location, if环境下,每行rewrite指令最后跟一个flag标记。标记有如下所示:

(1)  Flag种类
    Flag种类      规则
    last          本条规则匹配完成后,停止匹配,不再匹配后面的规则
    break         本条规则匹配完成后,停止匹配,不再匹配后面的规则
    redirect      返回302临时重定向,地址栏会显示跳转后的地址
    permanent     返回301永久重定向,地址栏会显示跳转后的地址
(2)  last和break的测试
[root@Nginx-6 conf.d]# cat rewrite.zxc.com.conf
server {
    listen 80;
    server_name rewrite.zxc.com;
    root /code;

    location ~ ^/break {
        rewrite ^/break /testbreak;
    }
    location ~ ^/last {
        rewrite ^/last /test/ last;
    }
    location /test/ {
            default_type application/json;
            return 200 "ok";
    }

}

#访问rewrite.zxc.com/break和rewrite.zxc.com/last结果进行对比
(3)  last和break的区别

last和break都是一个作用,都是表示停止rewrite规则,区别在于:
break只要匹配到规则,则会去本地路径的目录中寻找文件。
last只要匹配到规则,则会对其所在的server{…..}标签重新发起请求。
所以,在访问/break和last请求时,虽然对应的请求目录/test都不存在了,理论上都应该返回404,但是实际请求/last的时候,是会有后面location所匹配到的结果返回的。原因正在于此。

详细访问过程
break:
1.请求rewrite.zxc.com/break
首先:会去查找本地的/code/test/index.html;如果找到了,则返回/code/test/index.html的内容;如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403。

last:
1.请求rewrite.zxc.com/last
首先:会对当前server重新的发起一次请求,rewrite.zxc.com/test/,如果有location匹配上,则直接返回该location的内容。如果没有location匹配,/code/test/index.html;如果没找到该目录则报错404,如果找到该目录没找到对应的文件则403。

(4)  redirect和permanent区别
redirect和permanent都是一个跳转,那redirect和permanent区别在哪呢  (实现https)
redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
permanent: 第一次请求会询问,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。
(5)  redirect和permanent区别对比示例
[root@Nginx-6 conf.d]# cat rewrite.zxc.com.conf
server {
    listen 80;
    server_name rewrite.zxc.com;
    root /code;
 location ~^/zxc {
  rewrite ^(.*)$ http://www.baidu.com redirect;
  rewrite ^(.*)$ http://www.baidu.com permanent;
  #return 301 http://www.baidu.com;
  #return 302 http://www.baidu.com;
  }
}

#访问rewrite.zxc.com/zxc,先注释其中一条进行对比
#通过浏览器访问,redirect会进行302跳转
#通过浏览器访问,permanent会进行301跳转

3、Rewrite规则实现

(1) 用户访问/abc/1.html实际上真是访问是/ccc/bbb/2.html
#http://www.zxc.com/abc/1.htnml ==> http://www.zxc.com/ccc/bbb/2.htnml

#1.准备好真实的访问路径
[root@Nginx-6 ~]# mkdir /code/ccc/bbb -p
[root@Nginx-6 ~]# echo "ccc_bbb_2" /code/ccc/bbb/2.html

#2.Nginx跳转配置
[root@Nginx-6 conf.d]# cat ccbb.conf 
server {
    listen 80;
    
    location / {
        root /code;
        index index.html;
    }
    location /abc {
        rewrite (.*) /ccc/bbb/2.html redirect;
        #return 302 /ccc/bbb/2.html;
    }
}

#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(2) 用户访问/2108/ccc/bbb/2.html 实际上真实访问是/2014/ccc/bbb/2.html
##http://www.zxc.com/2018/ccc/bbb/2.htnml ==> http://www.zxc.com/2014/ccc/bbb/2.htnml

#1.准备真实的访问路径
[root@Nginx-6 conf.d]# mkdir /code/2014/ccc/bbb -p
[root@Nginx-6 conf.d]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html

#2. Nginx跳转设置
[root@Nginx-6 conf.d]# cat 2014.conf 
server {
    listen 80;
    
    location / {
        root /code;
        index index.html;
    }
    location /2018 {
        rewrite ^/2018/(.*)$ /2014/$1 redirect;
    }
}

#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(3) 用户访问/test 实际上真实访问是http://www.baidu.com
location /test {
 rewrite (.*) http://www.baidu.com redirect;
}
(4) 用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html
#http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html
#http://www.bgx.com/course-44-55-66.html ==> http://www.bgx.com/course/44/55/66/course_66.html

#1.准备真实的访问路径
[root@Nginx-6 conf.d]# mkdir /code/course/11/22/33 -p
[root@Nginx-6 conf.d]# echo "11-22-33" > /code/course/11/22/33/course_33.html

#2. Nginx跳转设置
[root@Nginx-6 conf.d]# cat course33.conf 
server {
    listen 80;
    
    location / {
        root /code;
        index index.html;
    }
    location ~ ^/course {
        rewrite (.*)-(.*)-(.*)-(.*).(.*) /$1/$2/$3/$4/$1_$4.$5 break;
}
}

#3. 重启Nginx服务
[root@Nginx-6 conf.d]# systemctl restart nginx
(5) 将http请求,跳转至https
server {
 listen 80;
 server_name www.zxc.com;
 rewite ^(.*) https:// $server_name$1 redirect;
 #return 302 https://$server_name$request_uri;
}

server {
 listen 443;
 server_name www.zxc.com;
 ssl on;
}

4、Rewrite 规则补充

rewrite匹配优先级
  1.先执行server块的rewrite指令
  2.其次执行location匹配规则
  3.最后执行location中的rewrite


原文始发于微信公众号(运维库):11-Nginx_Rewrite重写

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/64286.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!