08.Nginx Rewrite

1.Rewrite基本概述

1.什么是rewrite

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

2.Rewrite使用场景

1.URL地址跳转,例如用户访问bgx.com将其跳转到xuliangwei.com , 或者当用户通过http的方式访问bgx.com时,将其跳转至https的方式访问bgx.com
2.URL伪静态, 将动态页面显示为静态页面方式的一种技术, 便于搜索引擎的录入, 同时减少动态URL地址对外暴露过多的参数, 提升更高的安全性。
3.搜索引擎SEO优化依赖于url路径, 以便支持搜索引擎录入

2.Rewrite配置语法

Rewrite示例

Syntax: rewrite regex replacement [flag];Default: --Context: server, location, if

if 可以支持如下条件判断匹配符号

~ 正则匹配 (区分大小写) 
~* 正则匹配 (不区分大小写) 
!~ 正则不匹配 (区分大小写) 
!~* 正则不匹配 (不区分大小写)
-f 和!-f 用来判断是否存在文件
-d 和!-d 用来判断是否存在目录
-e 和!-e 用来判断是否存在文件或目录
-x 和!-x 用来判断文件是否可执行

在匹配过程中可以引用一些Nginx的全局变量

$document_root 针对当前请求的根路径设置值;
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$request_filename 当前请求的文件路径名(带网站的主目录/code/images/test.jpg)
$request_uri 当前请求的文件路径名(不带网站的主目录/images/test.jpg)
$scheme用的协议,比如http或者https

3.Rewrite标记Flag

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

flag
last本条规则匹配完成后,停止匹配,不在匹配后面的规则
break本条规则匹配完成后,停止匹配,不在匹配后面的规则
redirect返回302临时重定向, 地址栏会显示跳转后的地址
permanent返回301永久重定向, 地址栏会显示跳转后的地址

对比flag中breaklast

公司目前产品有一个url地址是www.oldboy.com/2017_old随着时间的推移, 
公司希望客户通过新的url访问www.oldboy.com/2019_new需要保证浏览器的url地址不发生变化

[root@m01 ~]# cat /etc/nginx/conf.d/rewrite.confserver {    listen 80;
    server_name www.oldboy.com;
    root /code;
    rewrite_log on;

    location ~ ^/2019_new {
        rewrite ^/2019_new /2017_old/ break;
    }
    location ~ ^/2020_new {
        rewrite ^/2020_new /2017_old/ last;
    }
    location ~ ^/2017_old {
        root /code;        index index.html;
    }
}#[root@m01 conf.d]# mkdir /code/2017_old[root@m01 conf.d]# echo "2017_old" > /code/2017_old/index.html

测试break

测试last

lastbreak对比总结:

last
1.last进行Rewrite匹配成功, 停止当前这个请求, 并根据rewrite匹配的规则重新向Server发起一个请求。
2.新请求的内容是域名+URL, 对应的地址为www.oldboy.com/2017_old

break
1.break进行Rewrite匹配成功后, 不会像last重新发起请求, 首先查找站点目录下/code/2017_old/默认返回页是否存在, 如不存在则404, 如存在继续往下匹配
2.根据Rewrite匹配的规则, 跳转至www.oldboy.com/2017_old/的URL地址, 匹配成功后则不继续匹配

对比flag中redirectpermanent

[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.confserver {
    listen 80;
    server_name localhost;
    root /soft/code;
   
    location ~ ^/bgx {
        rewrite  http://kt.xuliangwei.com redirect;
        rewrite  http://kt.xuliangwei.com permanent;
        #return 301 http://kt.xuliangwei.com;
        #return 302 http://kt.xuliangwei.com;
    }

测试Nginxredirect

nginx -s stop停止Nginx服务

测试Nginxpermanent

nginx -s stop停止Nginx服务

4.Rewrite场景示例

Rewrite匹配优先级

1.执行server块的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite

例1:

# 用户访问/abc/1.html 实际上真实访问是 /ccc/bbb/2.html#http://www.bgx.com/abc/1.html ==> http://www.bgx.com/ccc/bbb/2.html1.准备真实的访问路径
[root@web03 ~]# mkdir /code/ccc/bbb -p[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html2.Nginx跳转配置
[root@web03 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;
    }
}
[root@web03 ~]# systemctl restart nginx

例2:

# 用户访问/2018/ccc/bbb/2.html 实际上真实访问是 /2014/ccc/bbb/2.html#http://www.bgx.com/2018/ccc/bbb/2.html ==> http://www.bgx.com/2014/ccc/bbb/2.html1.准备真实的访问路径
[root@web03 ~]# mkdir /code/2014/ccc/bbb -p[root@web03 ~]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf server {    listen 80;
    
    location / {
        root /code;        index index.html;
    }
    location /2018 {
        rewrite ^/2018/(.*)$ /2014/$1 redirect;
    }
}
[root@web03 ~]# systemctl restart nginx

例3:

# 用户访问 /test目录下任何内容, 实际上真实访问是 http://www.xuliangwei.comlocation /test {    rewrite (.*) http://www.xuliangwei.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  1.准备真实的访问路径
[root@web03 ~]# mkdir /code/course/11/22/33/ -p[root@web03 ~]# echo "Curl docs" > /code/course/11/22/33/course_33.html2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf server {        listen 80;
        root /code;        index index.html;
        location / {                #灵活
            rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;                #固定
            #rewrite ^/course-(.*)  /course/11/22/33/course_33.html redirect;
        }
[root@web03 ~]# systemctl restart nginx

例5:

# 用户发起http请求,强制转到httpsserver {        listen 80;        server_name bgx.com;        rewrite ^(.*) https://$server_name$1 redirect;        #return 302 https://$server_name$request_uri;}


Powered By Z-BlogPHP 1.7.3

 Theme By 优美模版

本博客为开源博客,本博客联系QQ:372097243