zoukankan      html  css  js  c++  java
  • rewrite和return笔记

    linux9期架构-宋阳阳-day21

    课前回顾

    KVM服务可以在linux上做虚拟机
    
    禁ping(centos开启或关闭ping)
    	
    集群前后端分离接口(api接口):
    	作用:前端服务器(web)的api接口与后端服务器的(tomcat,)api接口的服务器连接
    
    SEO与浏览器搜索出来的网站排名有关
    
    浏览器URL中的变量是用来调用数据库的
    
    关系型数据库:
    非关系型数据库:
    

    tNefl4.md.png

    网页

    #什么是动态页,静态页,伪静态页
    URL中,'需要调用数据库',返回的网页,就是动态页(?就是传参,就是在访问数据库)
    URL中,'静态页不需要调用数据库',URL中显示准确的路径
    URL中,静态页需要调用数据库,'URL中显示伪造的路径',那么这个网页叫伪静态页
    访问某一资源,需要调用数据库,那么这个资源就是动态的,否则就是静态的,'静态与动态的区分与文件的种类无关,只和资源存放位置有关'
    
    #为什么要做伪静态:
    1.安全
    2.为了SEO,百度curl的是静态网页,做伪静态可以利用百度的抓取推广
    	
    #不能通过URL准确的判断一个网页是静态页还是动态页	
    不同的服务,伪静态的做法不一样,具体参考百度
    
    #伪静态的优缺点:
    1,文件存档,静态化页面存在服务器,伪静态化调用数据库虚拟生成的(实际还是动态)
    2,性能优势,在用户访问量大的时候,静态页面比伪静态更具优势(因为伪静态需要嗲用数据库)
    3,安全性能,基本上差不多都是静态化状态(伪静态伪造了服务器的真实路径)
    4,实际适用,伪静态比静态化更灵活,部分没法静态化的,都可以伪静态化。
    5.伪静态不能被超链接
    

    rewrite 企业应用场景

    Nginx的rewrite功能在企业里应用非常广泛:

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

    Rewrite配置示例

    句法:Syntax:  rewrite regex replacement [flag]
    默认:Default: --
    语境:Context: server,location,if
    
    #用于切换维护页面场景
    #rewrite ^(.*)$ /page/maintain.html break;		#$1?
    

    ngx_http_rewrite_module模块----Rewrite标记Flag

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

    flag 作用
    last 本条规则匹配完成后,停止匹配,再匹配后面的规则(因为重新发送了一次请求)
    break 本条规则匹配完成后,停止匹配,不再匹配后面的规则(404)
    redirect 返回302临时重定向,地址栏会显示跳转后的地址
    permanent 返回301永久重定向,地址栏会显示跳转后的地址(默认)

    ^(.*) URL

    ^(.*)$ URL

    ^/2018/(.*)$ 某一段URI

    (.*) URI

    rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect; 变量

    ^(.*) https://$server_name$1


    last与break区别对比示例

    [root@web01 conf.d]# vim /etc/nginx/conf.d/rewrite.conf 
    server {
            listen 80;
            server_name rw.com;
    
            location ~ ^/break {
                    rewrite ^/break /test/ break;
            }
            location ~ ^/last {
                    rewrite ^/last /test/ last;
            }
            location /test/ {
                    default_type application/json;
                    return 200 "ok";
            }
    }
    
    #重启nginx服务
    [root@web01 conf.d]# nginx -t 
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web01 conf.d]# nginx -s reload
    
    #/test目录不存在,也可以return
    return不支持正则,所以不支持复杂的重定向 ,
    return需要指定状态码,rewrite不需要指定状态码
    
    #有没有root ,不会影响URL的跳转,只是没有默认的location
    

    QQ截图20200602183214.png
    QQ截图20200602183142.png
    QQ截图20200602183120.png

    redirect与permanent区别对比示例

    域名的跳转

    [root@web01 conf.d]# vim /etc/nginx/conf.d/rw.conf 
    server {
            listen 80;
            server_name rw.com;
            root /code;
    
            location /test {
                    rewrite ^(.*)$  https://blog.driverzeng.com redirect;
                    #rewrite ^(.*)$  https://blog.driverzeng.com permanent;
                    #return 302 https://blog.driverzeng.com;
                    #return 301 https://blog.driverzeng.com;
            }
    }
    
    redirect: 每次请求都会询问服务器,如果当服务器不可用时,则会跳转失败。
    
    permanent: 第一次请求会询问客户端,浏览器会记录跳转的地址,第二次则不再询问服务器,直接通过浏览器缓存的地址跳转。第二次的访问与nginx服务器无关,(除非客户端清除缓存)
    
    临时重定向:
    	1.用户的访问(考虑到用户是否刷新浏览器)
    	2.http 转https
    
    永久重定向:
    
    #浏览器输入 rw.com或者rw.com/test	都是同样的跳转	
    

    QQ截图20200602184503.png
    QQ截图20200602184748.png


    开启rewrite日志

    [root@web01 code]# vim /etc/nginx/nginx.conf
    
    /var/log/nginx/error.log warn; ==> /var/log/nginx/error.log notice;
    
    http{
        rewrite_log on;
    }
    
        注意两点:
        1)在http字段加,反正我试了一下,在配置文件的开始位置,nginx会报rewrite_log 是一个不识别的变量。
            
         2)注意 error_log的级别是notice,否则不会显示其具体的匹配过程,但需要注意,最好在测试环境下调试,error_log会增长的很快,我们网站20分钟5G多,所以在线上调试完了,尽快关闭!!!或说改成error级别的。
    

    tNeswq.md.png
    tNeyT0.md.png


    案例一----------------文件的跳转

    用户访问/abc/1.html实际上真实访问的是/ccc/bbb/2.html

    #http://rw.com/abc/1.html  ==>  http://rw.com/ccc/bbb/2.html
    
    #1.准备真实访问路径
    [root@web03 ~]# mkdir /code/ccc/bbb -p
    [root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html
    
    #2.Nginx跳转配置
    [root@web03 conf.d]# vim /etc/nginx/conf.d/rw.conf 
    server {
            listen 80;
    	    server_name rw.com/;
    	    
            location / {
                    root /code;
                    index index.html;
            }
            location /abc {
                    rewrite (.*) /ccc/bbb/2.html redirect;
                    rewrite (.*) https://$host/ccc/bbb/2.html redirect;
                    #rewrite ^(.*)$ https://$host//ccc/bbb/2.html redirect;
                    #return 302 /ccc/bbb/2.html;
            }
    }
    
    #3.重启Nginx服务
    [root@web03 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web03 conf.d]# nginx -s reload
    
    location /abc === location ^/abc 
    (.*) 指的是URL,不带http://
    ^(.*)$ 指的是URL,带http://
    
    $host 域名
    

    案例二-------文件的跳转

    用户访问/2018/ccc/2.html实际上真实访问的是/2014/ccc/bbb/2.html

    ##http://rw.com/2018/ccc/2.html  ==>  http://rw.com/2014/ccc/bbb/2.html
    
    #1.准备真是的访问路径
    [root@web03 conf.c]# mkdir /code/2014/ccc/bbb -p 
    [root@web03 conf.c]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html
    
    #2.Nginx跳转配置
    [root@web03 conf.d]# vim /etc/nginx/conf.d/rw.conf 
    server {
            listen 80;
    	    server_name rw.com;
    	    
            location / {
                    root /code;
                    index index.html;
            }
            location /2018 {
                    rewrite /ccc/2.html /ccc/bbb/2.html redirect;
                    #rewrite ^/2018/(.*)$ /2014/$1 redirect;
            }
    }
    
    #3.重启nginx服务
    [root@web03 conf.d]# nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    [root@web03 conf.d]# nginx -s reload
    
    ^/2018/(.*)$中,^$可以省略
    $1相当于sed的后向引用
    

    案例三---------域名的跳转

    用户访问/test实际上真实访问的是https://blog.driverzeng.com

    #1.Nginx跳转配置
    [root@web03 conf.d]# cat test.conf 
    server {
            listen 80;
    		server_name localhost;
            location /test {
                    rewrite (.*) https://blog.driverzeng.com redirect;
            }
    }
    
    #2.重启nginx服务
    [root@web03 conf.d]# nginx -s reload
    

    案例四--文件的跳转

    用户访问couese-11-22-33.html实际上真实访问的是/course/11/22/33/course_33.html

    #http://www.drz.com/couese-11-22-33.html  ==>  http://www.drz.com/course/11/22/33/course_33.html
    
    #1.准备真是的访问路径
    [root@web03 ~]# mkdir /code/course/11/22/33 -p
    [root@web03 ~]# echo "curl docs.etiantian.org" > /code/course/11/22/33/course_33.html
    
    #2.Nginx跳转配置
    [root@web03 conf.d]# cat test.conf 
    server {
            listen 80;
    		server_name localhost;
            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;
            }
    }
    
    #3.重启nginx服务
    [root@web03 conf.d]# nginx -s reload
    

    案例五--------------域名和端口的跳转

    http请求跳转到https

    #Nginx跳转配置
    server {
            listen 80;
            server_name rw.com;
            rewrite ^(.*) https://$server_name$1 redirect;
            #return 302 https://$server_name$request_uri;
    }       
    
    server {
            listen 443;
            server_name blog.driverzeng.com;
            ssl on;
    }
    
    $server_name$1,加不加$1 一样,但是尽量加上
    

    实战---伪静态

    server {
            listen 80;
            server_name discuz.drz.com;
    
            location / {
                    root /code/discuz/upload;
                    index index.php index.html;
                    rewrite ^([^.]*)/topic-(.+).html$ $1/portal.php?mod=topic&topic=$2 last;
                    rewrite ^([^.]*)/article-([0-9]+)-([0-9]+).html$ $1/portal.php?mod=view&aid=$2&page=$3 last;
                    rewrite ^([^.]*)/forum-(w+)-([0-9]+).html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
                    rewrite ^([^.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
                    rewrite ^([^.]*)/group-([0-9]+)-([0-9]+).html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
                    rewrite ^([^.]*)/space-(username|uid)-(.+).html$ $1/home.php?mod=space&$2=$3 last;
                    rewrite ^([^.]*)/blog-([0-9]+)-([0-9]+).html$ $1/home.php?mod=space&uid=$2&do=blog&id=$3 last;
                    rewrite ^([^.]*)/(fid|tid)-([0-9]+).html$ $1/archiver/index.php?action=$2&value=$3 last;
                    if (!-e $request_filename) {
                        return 404;
                    }
            }
    
            location ~ .php$ {
                    root /code/discuz/upload;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                    include fastcgi_params;
            }
    }
    
    

    Rewrite与Nginx全局变量

    Rewrite在匹配过程中,会用到一些Nginx全局变量

    $server_name    #当前用户请求的域名
    
    server {
            listen 80;
            server_name test.drz.com;
            rewrite ^(.*)$ https://$server_name$1;
    }
    $request_filename 请求的文件路径名(带网站的主目录/code/images/test.jpg)	#
    $request_uri 当前请求的文件路径(不带网站的主目录/inages/test.jpg)
    
    #大多数用于http协议转https协议
    server {
            listen 80;
            server_name php.drz.com;
            return 302 https://$server_name$request_uri;
    }
    $scheme 用的协议,比如http或者https
    

    如何更加规范的书写Rewrite规则

    server {
            listen 80;
            server_name www.drz.com drz.com;
            if ($http_host = drz.com){
                rewrite (.*) http://www.drz.com$1;
            }
    }
    
    # $http_host 
    
    #推荐书写格式
    server {
            listen 80;
            server_name drz.com;
            rewrite ^(.*)$ http://www.drz.com$request_uri;
    }
    server {
            listen 80;
            server_name www.drz.com;
    }
    

  • 相关阅读:
    SQL中的数据库设计三范式
    SQL中的DBA命令
    SQL中的视图
    SQL中的索引
    十大程序员必逛网站
    解放双手!你不知道的代码生成神器
    IT体系的演变
    Nginx的六种负载均衡策略
    前端Chrome调试小技巧汇总
    spring boot:使用async异步线程池发送注册邮件(spring boot 2.3.1)
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/13034364.html
Copyright © 2011-2022 走看看