rewrite和return笔记

课前回顾

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;
}

posted @ 2020-06-02 22:47  看萝卜在飘  阅读(706)  评论(0编辑  收藏  举报