zoukankan      html  css  js  c++  java
  • day 42 nginx rewrite跳转

    第1章 Nginx rewrite跳转

    1.官方地址
    https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

    2.应用场景
    http跳转https
    旧站点跳转到新站点
    根据终端类型进行跳转到不同页面
    根据不同地址跳使用不同的代码目录

    3.ngx_http_rewrite_module模块介绍

    break #中断配置
    if #请求判断
    set #设置变量
    return #返回状态或URL
    rewrite #对用户请求的URL或URI进行重写

    第2章 if指令
    1.官方文档:
    http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

    2.指令说明:
    if用于条件判断,并且可以根据判断的结果执行不同的配置
    if可以配置在server或location中。

    3.指令语法:

    if (匹配条件) { 
    	执行的动作
    }
    

    4.实验配置

    cat >/etc/nginx/conf.d/if.conf << 'EOF'
    server {
        listen       80 default_server;
        server_name  www.oldzhang.com;
        root   /usr/share/nginx/html/www;
    location / {
        #客户端类型完全匹配iphone
        if ($http_user_agent = iphone) {
           return 200 "agent is iphone";
                                  }
        
        #客户端类型区分大小写匹配
        if ($http_user_agent ~ Android) {
           return 200 "agent is Android";
                           }
        
        #客户端类型不区分大小写匹配
        if ($http_user_agent ~* Chrome) {
           return 200 "agent is Chrome";
                    }
        
        #如果不是GET则输出
        if ($request_method != GET){
           return 200 "method is not GET";
                     }
        
        #如果是IE浏览器,直接返回404
        if ($http_user_agent ~* IE){
           return 111 "IE is too low!";
                   }
        
        #都没匹配上则执行下面语句
        return 200 "not match agent ==> $http_user_agent request ==> $request_method";
              }
        }
    EOF
    

    5.测试方法

    默认访问

    [root@web-7 ~]# curl 127.0.0.1
    not match agent ==> curl/7.29.0 request ==> GET

    测试精确匹配=

    [root@web-7 ~]# curl -A "iphone" 127.0.0.1
    agent is iphone

    [root@web-7 ~]# curl -A "iphoneeeee" 127.0.0.1
    not match agent ==> iphoneeeee request ==> GET

    [root@web-7 ~]# curl -A "iphonE" 127.0.0.1
    not match agent ==> iphonE request ==> GET

    区分大小写匹配

    [root@web-7 ~]# curl -A "Android" 127.0.0.1
    agent is Android

    [root@web-7 ~]# curl -A "Androiddddddd" 127.0.0.1
    agent is Android

    [root@web-7 ~]# curl -A "aAndroiddddddd" 127.0.0.1
    agent is Android

    [root@web-7 ~]# curl -A "123Axndroiddddddd" 127.0.0.1
    not match agent ==> 123Axndroiddddddd request ==> GET

    客户端类型不区分大小写匹配

    [root@web-7 ~]# curl -A "Chrome" 127.0.0.1
    agent is Chrome
    [root@web-7 ~]# curl -A "chrome" 127.0.0.1
    agent is Chrome

    如果不是GET则输出

    [root@web-7 ~]# curl -X "POST" 127.0.0.1
    method is not GET

    [root@web-7 ~]# curl -X "PUT" 127.0.0.1
    method is not GET

    如果是IE浏览器,直接返回404

    [root@web-7 ~]# curl -A "ie" 127.0.0.1
    IE is too low!
    [root@web-7 ~]# curl -A "Ie" 127.0.0.1
    IE is too low!

    第3章 rewrite指令
    1.官方文档
    https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

    2.指令语法
    rewrite regex replacement [flag];
    rewrite 匹配规则 重写指令 [标志符];

    rewrite指令可以作用于server, location, if

    3.flag标识符说明
    flag作用说明:
    redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,浏览器不会缓存DNS记录
    permanent 返回301临时重定向,浏览器地址会显示跳转后的URL地址,浏览器会缓存DNS记录
    last 本条规则匹配完成后,继续向下匹配新的location URI规则
    break 本条规则匹配完成即终止,不再匹配后面的任何规则

    使用场景区分:

    • 使用redirect和permanent参数,浏览器会显示跳转后的URL,服务端将改写后的URL返回给客户端,由客户端重新发起新的请求。
    • 使用last和break,浏览器显示的还是原来的URL,由服务器内部完成跳转。

    last和break区别:

    last标记在本条规则匹配完成后,对其所在的server标签重新发起修改后的URL请求,再次匹配location。
    break标记则会在本条规则匹配完成后,终止匹配,不会在匹配后面的规则。

    第4章 redirect和permanent实验
    1.permanent 301 永久跳转 实验
    访问: www.oldboy.com
    跳转: blog.oldboy.com

    2.配置文件:

    cat > /etc/nginx/conf.d/www.conf << 'EOF'
    server   {
        listen       80;
        server_name  www.oldboy.com;
        location / {
            rewrite / http://blog.oldboy.com permanent;
        }
    }
    EOF
    
    cat > /etc/nginx/conf.d/blog.conf << 'EOF'
    server   {
        listen       80;
        server_name  blog.oldboy.com;
        location / {
            root   /code/blog;
            index  index.html;
        }
    }
    EOF
    
    mkdir /code/{www,blog} -p
    echo www > /code/www/index.html
    echo blog > /code/blog/index.html
    
    nginx -t 
    systemctl restart nginx
    

    3.替换的坑

    If a replacement string starts with “http://”, “https://”, or “$scheme”, the processing stops and the redirect is returned to a client.
    

    默认是替换:

    rewrite / blog.oldboy.com permanent;
    www.oldboy.com/
    www.oldboy.com/blog.oldboy.com
    

    如果替换的内容以http://开头,则直接访问新的地址

    rewrite / http://blog.oldboy.com permanent;
    www.oldboy.com 
    blog.oldboy.com
    

    4.302跳转

    cat > /etc/nginx/conf.d/www.conf << 'EOF'
    server   {
        listen       80;
        server_name  www.oldboy.com;
        location / {
    	    rewrite / http://blog.oldboy.com redirect;
            #rewrite / http://blog.oldboy.com permanent;
        }
    }
    EOF
    

    5.模拟jd跳转

    www.360buy.com --> 301 http://www.jd.com/ --> 302 https://www.jd.com/
    www.oldboy.com --> 301 http://blog.oldboy.com --> https://blog.oldboy.com/
    

    www的配置:

    cat > /etc/nginx/conf.d/www.conf << 'EOF'
    server   {
        listen       80;
        server_name  www.oldboy.com;
        location / {
            rewrite / http://blog.oldboy.com permanent;
        }
    }
    EOF
    

    blog的配置:

    cat > /etc/nginx/conf.d/blog.conf << 'EOF'
    server   {
        listen       80;
        server_name  blog.oldboy.com;
        location / {
    		rewrite / https://blog.oldboy.com redirect;
        }
    }
    EOF
    

    第5章 last实验
    1.配置文件

    cat > /etc/nginx/conf.d/www.conf << 'EOF'
    server   {
        listen       80;
        server_name  www.oldboy.com;
        location /CCC {
            return 200 "CCCC \n";
        } 
    location /BBB {
        rewrite ^/BBB/(.*)$ /CCC/$1 last;
    }
    
    location /AAA {
        rewrite ^/AAA/(.*)$ /BBB/$1 last;
    }
    }
    EOF
    
    rewrite ^/AAA/(.*)$ /BBB/$1 last;
    www.oldboy.com/AAA/123.txt
    www.oldboy.com/BBB/123.txt
    
    rewrite ^/BBB/(.*)$ /CCC/$1 last;
    www.oldboy.com/BBB/123.txt
    www.oldboy.com/CCC/123.txt
    

    第6章 break
    配置步骤:

    server   {
        listen       80;
        server_name  www.oldboy.com;
        location /CCC {
            return 200 "CCCC \n";
        } 
    location /BBB {
        rewrite ^/BBB/(.*)$ /CCC/$1 last;
    }
    
    location /AAA {
        rewrite ^/AAA/(.*)$ /BBB/$1 break;
        root /code/www;
        index index.html;
    }
    }
    

    创建目录:

    mkdir -p /code/www/AAA
    mkdir -p /code/www/BBB
    mkdir -p /code/www/CCC
    echo AAA > /code/www/AAA/index.html
    echo BBB > /code/www/BBB/index.html   
    echo CCC > /code/www/CCC/index.html   
    tree /code/www/
    

    总结:
    不同域名之间跳转:
    redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,浏览器不会缓存DNS记录
    permanent 返回301临时重定向,浏览器地址会显示跳转后的URL地址,浏览器会缓存DNS记录

    同一个域名内部跳转:
    last 本条规则匹配完成后,继续向下匹配新的location URI规则
    break 本条规则匹配完成即终止,不再匹配后面的任何规则

    第7章 跳转实验
    1.需求:
    用户访问 www.oldboy.com/img/2021/05/10/linux.jpg
    跳转到 img.oldboy.com/2021-05-10-linux.jpg

    2.www的配置:

    cat > /etc/nginx/conf.d/www.conf << 'EOF'
    server   {
        listen       80;
        server_name  www.oldboy.com;
        location /img/ {
            rewrite ^/img/([0-9]+)/([0-9]+)/([0-9]+)/(.*).jpg$ http://img.oldboy.com/$1-$2-$3-$4.jpg permanent;
        }
    }
    EOF
    

    3.blog的配置:

    cat > /etc/nginx/conf.d/img.conf << 'EOF'
    server   {
        listen       80;
        server_name  img.oldboy.com;
        location / {
          root /code/img;
          index index.html;
        }
    }
    EOF
    

    总结:
    location模块:
    | 匹配符 | 匹配规则 | 优先级 |
    | = | 精确匹配 | 1 |
    | ^~ | 以某个字符串开头 | 2 |
    | ~ | 区分大小写的正则匹配 | 3 |
    | ~* | 不区分大小写的正则匹配 | 4 |
    | / | 通用匹配,任何请求都会匹配到5 | 5 |

    rewrite模块:
    return直接返回
    if判断
    rewrite跳转
    不同域名之间跳转:
    redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址,浏览器不会缓存DNS记录
    permanent 返回301临时重定向,浏览器地址会显示跳转后的URL地址,浏览器会缓存DNS记录

    同一个域名内部跳转:
    last 本条规则匹配完成后,继续向下匹配新的location URI规则
    break 本条规则匹配完成即终止,不再匹配后面的任何规则

  • 相关阅读:
    原创 爱因斯坦迷题及推导过程
    惊闻姑姑家女婿去世,哀叹生命之脆弱,死亡如此接近
    京东自营预售逻辑
    自营SKU绑定逻辑
    自营结算解释&对账逻辑
    CPS逻辑
    京东搜索结果数据异常
    C++静态库中使用_declspec(dllexport) 不能导出函数的问题
    HTTP+SVN访问速度慢的问题
    Python log
  • 原文地址:https://www.cnblogs.com/zhaocheng690/p/15609722.html
Copyright © 2011-2022 走看看