一、服务器端跳转 vs 客户端跳转
1、服务器端跳转:
- step1:客户端发起一次页面请求(请求页面A)
- step2:服务器端接收到请求后再在内部发生一次页面请求(请求页面C)
- step3:最终将页面C呈现给客户端作为响应
- 小结:仍是请求-响应的过程,只不过服务器在做出响应之前内部发生了页面跳转,而整个过程中,客户端只发生了一次请求,且客户端感知不到跳转过程
2、客户端跳转:- step1:客户端发起一次请求,服务器端做出一次响应
- step2:客户端在当前页面内发起请求,服务端再次做出响应
3、两者区别:- URL变化:服务器端跳转时不会改变地址栏中URL,而客户端跳转时会改变相应URL;
- Request属性:服务器端跳转时,未超出request的属性范围,request属性能够保存到跳转页,而客户端跳转时,则超出了request的属性范围,无法进行其属性的传递;
- JS执行:服务器端执行到发生跳转的JS语句后不再继续执行而是直接发生跳转,而客户端会执行完全部的JS语句后才发生跳转;
二、实现服务器端跳转
1、两个HTTP STATUS CODE ---- 301、302:
- 301:永久性跳转(Permanently Moved),即从页面A跳转到页面B后再也不会回到页面A了
- 302:暂时性跳转(Temporarily Moved),即表示页面从A跳转到B后仍会回到A,页面A和B得URL都会被缓存
2、301应用场景:
1)域名到期不想续费(或者发现了更适合网站的域名),想换个域名。
2)在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。
3)空间服务器不稳定,换空间的时候。
应用场景内容摘自他人文章,自己照上述所说还还没有复现成功过
3、302应用(亲测):
- 当访问某个需要先登录的网站时,会重定向到登录界面,这时确实会看到http返回了302状态码;
- 当再次访问此网站时,就会发现登录页面已经被缓存了,也就不需要再次请求重定向了;
- 注:是否执行302重定向因网站而异,只是恰好发现了某网站执行了302重定向
4、PHP实现301、302:
//实际中,下例中的url为重定向的目标页面
# 实现302:
<?php header("Location:url"); ?>
# 实现301:
<?php header("HTTP/1.1 301 Moved Permanently"); header("Location:url"); ?>
5、尽量避免使用302,以防URL劫持:
URL劫持定义:
从网址A 做一个302 重定向到网址B 时,主机服务器的隐含意思是网址A 随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302 重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。如果搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担心网址URL 劫持了。问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。比如说,有的时候A 网址很短,但是它做了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很自然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 很有可能会仍然显示网址A。由于搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL 劫持的可能性。也就是说,一个不道德的人在他自己的网址A 做一个302 重定向到你的网址B,出于某种原因, Google 搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B 上的内容,这种情况就叫做网址URL 劫持。
三、实现客户端跳转
1、HTML实现:
<head>
<!-- 以下方式只是刷新不跳转到其他页面 -->
<meta http-equiv="refresh" content="10">
<!-- 以下方式定时转到其他页面 -->
<meta http-equiv="refresh" content="5;url=hello.html">
</head>
2、提交表单、点击链接等都属于客户端页面跳转