当网站地址变更时,需要将旧域名301重定向到新的URL地址,实际上就是把旧地址的访问请求重新引导到新域名上。301永久重定向无论是对用户还是搜索引擎都是比较友好的,对SEO完全没有不好的一面。通过旧网站的关键词排名和PR等级都会传递给新网站,网站更换了域名,用域名301永久重定向的方式告诉搜索引擎本网页已经永久性转移到新的域名,避免搜索引擎无法找到页面,网站对于搜索引擎相对比较友好。
域名重定向的好处有利于用户体验和搜索引擎抓取,301重定向跳转对搜索引擎的好处有、增加域名权重、对网页收录的优化、有利于网页PR传递、可促进搜索引擎优化效果、对用户体验表示友、避免造成404错误页面。使用301重定向把地址指向新的域名后,搜索引擎只对对新域名进行索引,同时将旧地址原有的链接转移搭配新域名下。正确的使用301永久性重定向命,对排名不会产生任何影响。
一、域名301重定向什么情况下使用
1、网站域名变更时,使用301永久重定向将旧域名重定向至新域名,挽回关键词排名和流量损失。
2、因某些原因需要删除网站中的个别目录时,比如我要删除巨推传媒:400-606-5558的一级导航,这种情况就可以使用301永久重定向到网站首页。
3、多个域名需要指向同一个站点时,打算实现网址规范化,通过301永久重定向可以实现。
二、http中的重定向和请求转发的区别(包含JS跳转方法)
很简单,重定向是客户端行为,转发是服务器行为。转发属于一次请求,重定向属于第2次请求,转发地址栏不会发生改变,重定向地址栏会改变,转发在项目内,重定向 可以转到项目外。当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是先进个页面通知浏览器发送一个新的页面请求。
1、调用方式
我们知道,在servlet中调用转发、重定向的语句如下:
request.getRequestDispatcher("new.jsp").forward(request, response);//转发到new.jsp
response.sendRedirect("new.jsp");//重定向到new.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp");// 重定向到new.jsp%>
当然也可以在jsp页面中实现重定向:
<%response.sendRedirect("new.jsp");//
2、本质区别
解释一
一句话,重定向是客户端行为,转发是服务器行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求----》web服务器接受此请求--》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其先进次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器--》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request,
先进次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
举例:response.sendRedirece(“loginsucess.jsp”)
请求转发是服务器内部把对一个request/response的处理权,移交给另外一个
对于客户端而言,它只知道自己最早请求的那个A,而不知道中间的B,甚至C、D。 传输的信息不会丢失。
举例:
//Request Dispatcher dis=request.getRequestDispatcher(“loginsuccess”)
//dis.forward(request,response):
前言
html ,js 可以实现页面跳转。
jsp , asp, php 也有各自页面跳转与重定向的方式。
下文针对js 和jsp 的页面跳转实现方式进行一个总结。
html 页面跳转方式
可以使用html 的meta 标签实现页面的跳转。
[html] view plain copy
1.
2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
3.
4.
5.
6. <META NAME="Author" CONTENT="oscar999">
7. <meta http-equiv="refresh" content="0; URL=http://www.haotui.com.cn">
8.
10.
11.
12.
13. This is Test Page
14.
15.
这种用法比较常使用在:
新旧系统升级的状况下, 暂时保留旧系统,通过域名进入时自动转到新系统中。
JS 页面跳转方式
1. 使用window.location = "newurl"
[html] view plain copy
1.
2. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
3.
4.
5.
6. <META NAME="Author" CONTENT="oscar999">
7.
8.
9.
10.
11. This is Test Page.
12.
15.
16.
也可以使用 window.location.href = "http://www.haotui.com.cn";
2. 使用 window.navigate
[html] view plain copy
1.
3. window.loction.replace方式实现页面跳转
有3个jsp页面(1.aspx, 2.aspx, 3.aspx),进系统默认的是1.aspx,当我进入2.aspx的时候, 2.aspx里面用window.location.replace("3.aspx");
与用window.location.href ("3.aspx");
从用户界面来看是没有什么区别的,但是当3.aspx页面有一个"返回"按钮,调用window.history.go(-1); wondow.history.back();方法的时候,一点这个返回按钮就要返回2.aspx页面的话,区别就出来了,当用 window.location.replace("3.aspx");连到3.aspx页面的话,3.aspx页面中的调用 window.history.go(-1);wondow.history.back();方法是不好用的,会返回到1.aspx。
JSP跳转方式
JSP 跳转方式大约有三种:
1. response.sendRedirect(“newurl”);
-- 此语句前不允许有out.flush(),如果有,会有异常:
java.lang.IllegalStateException: Can't sendRedirect() after data has committed to the client.
at com.caucho.server.connection.AbstractHttpResponse.sendRedirect(AbstractHttpResponse.java:558)
--跳转后浏览器地址栏变化
--如果要跳到不同主机下,跳转后,此语句后面的语句会继续执行,如同新开了线程,但是对response的操作已经无意义了
如果要跳到相同主机下,此语句后面的语句执行完成后才会跳转;
2. response.setHeader("Location","newurl");
[html] view plain copy
1. response.setStatus(302);
2. response.setHeader("location","newurl");
这种使用方式要结合 setStatus(302), 302 这个状态码就是告诉浏览器要重定向了。
1. 此语句前不允许有out.flush(),如果有,页面不会跳转。
2. 跳转后浏览器地址栏变化
3. 此语句后面的语句执行完成后才会跳转
此语句前不允许有out.flush(),如果有,会有异常:
跳转后浏览器地址栏不变,但是只能跳到当前主机下
此语句后面的语句执行完成后才会跳转
跳转后得路径变为当前路径,图片不是绝对路径将无法显示
举例:
整个简单的例子: 两个文件 a.jsp 和 b.jsp .
[html] view plain copy
1.
2.
3. <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
4. pageEncoding="ISO-8859-1"%>
5. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www2.w3.org/TR/html4/loose.dtd">
6.
7.
8. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
9.
10.
11.
12. Before: This is a.jsp!
13. <%
14. //response.sendRedirect("b.jsp");
15.
16. //response.setStatus(302);
17. //response.setHeader("location","b.jsp");
18.
19. %>
20.
21. <jsp:forward page="b.jsp"/>
22. After: This is a.jsp!
23.
24.
对于jsp 而言, 就需要嚼一嚼Redirect 和 forward 的差别了。
就字面意思而已: Redirect 翻译成重定向, forward翻译成转发。
类别 | 概念 | 共享数据 | 应用 |
Redirect | URL重新定向:可以是任意的URL | 不能共享request里面的数据 | 一般用于用户注销登录时返回主页面和跳转到其它的网站等等 |
Forward | 页面的转发:只能是同一个Web应用程序的其他Web组件 | 转发页面和转发到的页面可以共性request里面的数据 | 一般用于用户登录的时候根据角色转发到相应的模块等等
|
三、http重定向301/302/303/307
301 永久重定向,告诉客户端以后应从新地址访问.
302 作为HTTP1.0的标准,以前叫做Moved Temporarily ,现在叫Found. 现在使用只是为了兼容性的处理,包括PHP的默认Location重定向用的也是302.
但是HTTP 1.1 有303 和307作为详细的补充,其实是对302的细化
303:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
测试的test.html代码,发起post请求到test.php页面中
test.php页面分别给出3种重定向处理,都跳到test2.php
test2.php打印出post的结果
(至于怎么写..自己查手册吧,PHP发送头很容易.)
1.....
2.301 => "HTTP/1.1 301 Moved Permanently",
3.302 => "HTTP/1.1 302 Found",
4.303 => "HTTP/1.1 303 See Other",
5.307 => "HTTP/1.1 307 Temporary Redirect",
6.....
测试结果:
301,302和303的处理结果是一样的,直接跳转到test2.php,post没有内容
307的会重新post请求到test2.php,并且给出页面提示
重定向实际使用是一个响应码(301或302或303或307)和一个响应头location,当浏览器收到响应的时候check响应码是3xx,则会取出响应头中location对应的url(重定向中url的编码问题),然后将该url替换浏览器地址栏并发起另一次HTTP事务。
关于301、302、303、307的区别,找不到好的文章,因此打算直撸HTTP 1.0规范和HTTP 1.1规范,结合一些实际的案例和tomcat实现,来说清楚这几个状态码的差异。
四、 https301重定向
原请求访问的是http://haotui.com.cn,然后返回302location=https://haotui.com.cn,从http转到https。不过关于响应行中302状态码的描述存在争议,在下文中会详细讨论。
五、tomcat重定向源码
六、http详细介绍
http 1.0规范中有2个重定向——301和302,在http 1.1规范中存在4个重定向——301、302、303和307,其中302是值得讨论讨论的。
1、 http 1.0
301状态码在HTTP 1.0和HTTP 1.1规范中均代表永久重定向,对于资源请求,原来的url和响应头中location的url而言,资源应该对应location中的url。对于post请求的重定向,还是需要用户确认之后才能重定向,并且应该以post方法发出重定向请求。
关于post请求重定向用户确认的问题,实际上浏览器都没有实现;而且post请求的重定向应该发起post请求,这里浏览器也并不一定遵守,所以说HTTP规范的实现并未严格按照HTTP规范的语义。
在301中资源对应的路径修改为location的url,在SEO中并未出现问题,但是在302中就出现了302劫持问题。
1、301永久移动
被请求的资源被分配了一个新的永久URL,并且任何未来对这个资源的引用应该使用该URL来完成。具有链接编辑能力的客户端应该在可能的情况下自动地将对request-URL的引用重新链接到由服务器返回的新引用。
新的URL必须由response.unless中的location字段给出,如果是HEAD请求,则响应的实体主体应该包含一个带有到新URL的超链接的短信。
如果使用POST方法接收到301状态代码以响应请求,则用户agnet不能自动重定向请求,除非用户可以确认,否则可能会改变发出请求的条件。
NOts:在收到301状态码后自动重定向POST请求时,一些现有的用户代理将错误地将其更改为GET请求。
在http 1.0规范中,302表示临时重定向,location中的地址不应该被认为是资源路径,在后续的请求中应该继续使用原地址。
规范:原请求是post,则不能自动进行重定向;原请求是get,可以自动重定向;
实现:浏览器和服务器的实现并没有严格遵守HTTP中302的规范,服务器不加遵守的返回302,浏览器即便原请求是post也会自动重定向,导致规范和实现出现了二义性,由此衍生了一些问题,譬如302劫持,因此在HTTP 1.1中将302的规范细化成了303和307,希望以此来消除二义性。
补充:302劫持——A站通过重定向到B站的资源xxoo,A站实际上什么都没做但是有一个比较友好的域名,web资源xxoo存在B站并由B站提供,但是B站的域名不那么友好,因此对搜索引擎而言,可能会保存A站的地址对应xxoo资源而不是B站,这就意味着B站出了资源版权、带宽、服务器的钱,但是用户通过搜索引擎搜索xxoo资源的时候出来的是A站,A站什么都没做却被索搜引擎广而告之用户,B站做了一切却不被用户知道,价值被A站窃取了。
2、302暂时移动
被请求的资源暂时驻留在不同的URL中。因为重定向可能偶尔会被改变,所以clinet应该继续使用请求URL来作为将来的请求。
URL必须由响应中的位置字段给出。除非是HEAD请求,否则响应的实体主体应该包含一个带有到新URL的超链接的短注释。
如果使用POST方法接收到302状态码以响应请求,则除非用户能够确认,否则用户代理不能自动重定向请求,因为这可能会改变发出请求的条件。
注意:在收到302状态码后自动重定向POST请求时,一些现有的用户代理将错误地将其更改为GRT请求。
2. http 1.1
301和http 1.0规范中保持一致,注意资源对应的路径应该是location中返回的url,而不再是原请求地址。
302在HTTP 1.1中,实际上302是不再推荐使用的,只是为了兼容而作保留。规范中再次重申只有当原请求是GET or HEAD方式的时候才能自动的重定向,为了消除HTTP 1.0中302的二义性,在HTTP 1.1中引入了303和307来细化HTTP 1.0中302的语义。
1、302found
被请求的资源暂时驻留在一个不同的URL中,因为重定向可能会被改变,客户端应该继续使用请求URL来做未来的请求,这个响应只有在缓存控制或者Expires头域指示的时候才能被缓存。
临时URL应该由响应中的位置字段给出。如果请求方法是HEAD,响应实体应该包含一个超链接到新URL的短超文本记录。
如果为了响应GET或HEAD以外的请求而接收到302状态码,除非用户能够确认,否则用户代理不能自动重定向请求,因为这可能会改变发出请求的条件。
注意:RFC 1945和RFC 2068指定客户端不允许更改重定向的请求上的方法。但是,大多数现有的用户代理实现将302视为303响应,对位置字段值执行GET原始请求方法的状态代码303和307已经被添加用于希望明确地清楚客户端期望哪种反应的服务器。
303在HTTP 1.0的时候,302的规范是原请求是post不可以自动重定向,但是服务器和浏览器的实现是运行重定向。
把HTTP 1.0规范中302的规范和实现拆分开,分别赋予HTTP 1.1中303和307,因此在HTTP 1.1中,303继承了HTTP 1.0中302的实现(即原请求是post,也允许自动进行重定向,结果是无论原请求是get还是post,都可以自动进行重定向),而307则继承了HTTP 1.0中302的规范(即如果原请求是post,则不允许进行自动重定向,结果是post不重定向,get可以自动重定向)。
2、303see other
对请求的响应可以在不同的URL下找到,并且应该在该资源上使用GET方法来获取。这个方法的存在主要是为了允许输出POST激活的脚本来将用户代理重定向到选定的资源。新的URL 不是原始请求资源的替代引用,303响应不能被缓存,但是对第二个(重定向的)请求的响应可能是可缓存的。
不同的URL应该通过响应中的位置字段求得。如果请求方法是HEAD,响应实体应该包含一个超链接到新URL的短超文本记录。
注意:很多HTTP-1.1用户代理不了解303的状态。当与这些客户端的互操作性是一个问题时,可以使用302状态代码。因为大多数用户代理对302响应做出反应,如303所述。
307在http 1.1规范中,307为临时重定向,注意划红线的部分,如果重定向307的原请求不是get或者head方法,那么浏览器一定不能自动的进行重定向,即便location有url,也应该忽略。
也就是307继承了302在HTTP 1.0中的规范(303继承了302在HTTP 1.0中的实现)。
3、307当代重定向
被请求的资源暂时驻留在一个不同的URL中。由于重定向可能偶尔被修改,所以客户端应该继续使用请求URL作为将来的请求。这个响应只有在cache-control或expires头域指示的情况下才能被缓存。
临时URL应该由响应中的位置字段给出。如果请求方法是HEAD,那么响应实体应该包含一个超链接到新URL(d)的短超文本记录,因为许多pre-HTTP / 1.1 用户代理不理解307状态。因此,注释应该包含用户在新的URL上重复原始请求所需的信息。
如果接收到307状态码以响应除GET或HEAD之外的请求,则用户代理不能自动重定向请求,除非用户可以确认它,因为这可能会改变发出请求的条件。
在HTTP 1.0规范中,302的规范并没有被服务器和浏览器遵守,即规范和实现出现了二义性,因此在HTTP 1.1中,将302的规范和实现拆分成了303和307。
浏览器对307状态的处理规划与302状态相同,之所以将值307引入到HTTP1.1中,是因为在最初的消息是POST的情况下,许多浏览器依旧错误地跟随302响应中的定向信息。浏览器应该只在接收到303响应状态时才从POST请求的重定向信息。引入这个新状态是为了去除二义性:如果接到303响应,则进行进行GET和POST请求的重定向,如果接收到307响应,对于GET请求的重定向,则继续进行,但对于POST请求的重定向,则不在继续下去。
七、HTTP状态码302、303、307区别
HTTP状态码3XX表示重定向,表明浏览器需要执行某些特殊的处理以正确处理请求。
301 Moved Permanently
永久性定向。该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。
302 Found
临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。和301相似,但302表示的资源不是永久移动,只是临时性的。换句话说,已移动的资源对应的URI将来还有可能发生变化,比如,用户把uri保存为书签,但不会像301状态码出现时那样更新书签,而是仍旧保留返回302状态码的页面对应的uri
303 See Other
该状态码表示由于请求对应的资源存在着另一个URI,应使用GET方法定向获取请求的资源,=,
303和302状态码有着相同的功能,但是303明确表示客户端应当采用get方法获取资源,这点与302状态码有区别。
比如,当使用post方法访问CGI程序,其执行后的处理结果为希望客户端能以get方法重定向到另一个uri上去时,返回303状态码。虽然302也可实现相同的功能,但这里使用302状态码是最理想的。
当301、302、303响应状态码返回时,几乎所有浏览器都会把post改成get,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将post方法改变成get方法的,但实际使用时大家都会这么做。
307 Temporary Redirect
临时重定向。该状态码与302有相同的含义。尽管302标准禁止post变化get,但实际使用时大家不遵守。
307会遵照浏览器标准,不会从post变为get。但是对于处理响应时的行为,各种浏览器有可能出现不同的情况。
本文由巨推传媒:400-606-5558提供的域名301重定向页面转跳的操作方法
作者: 巨推传媒:400-606-5558
版权属于: 巨推传媒:400-606-5558,
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
更多推荐
更多推荐