zoukankan      html  css  js  c++  java
  • ASP.NET的SEO:HTTP报头状态码内容重定向

    本系列目录

    我们经常说“404错误”,你知道他指的是什么意思么?

    404其实是Http报头所包含的一个“状态码”,表明该Http请求失败。那么除此之外,还有哪些常用的状态码呢?这些状态码和SEO又有什么关系呢?


    每次当用户代理(可以理解为就是IE和Firefox)向Web站点请求一个URL地址,服务器都会给予回复,回复内容包括两部分:HTTP报头,和被请求的内容。但仅从浏览器上我们通常只能看到内容而看不到报头信息。所以,我们需要通过一些浏览器插件来观察他们。就我个人而言,IE我用WebDeveloper;FireFox我用Fiddler。有兴趣的朋友可以在网上自行下载,两个都是相当流行的。

    对SEO而言,我们需要了解的状态代码有:
    重定向:301和302
    被删除:404
    服务器错误:500

    我们依次讲解,首先将302。302在asp.net中有一个很常见的原型:Response.Redirect(),请看代码:
        protected void Button1_Click(object sender, EventArgs e)
        {
            Response.Redirect(
    "~/target.aspx");
            
    //Server.Transfer("~/target.aspx");
        }

    source.aspx页面上一个Button,Click事件中代码为Response.Redirect(~/target.aspx),点击source.aspx页面Button,查看该页面对应的状态码,结果就是302。(如下图,我使用的是Web Development,不知道为什么enable log之后,就无法再转到target页面了?各位同学知道原因的请指点一二)

     

    但可以查看详细信息,可以发现302的影响,response指明了要转向的url。

     

    客户端/服务器之间往返的过程其实是这样的:

    1. 点击Button,产生回发,回发的目标页面仍然是source.aspx,所以请求仍由source.aspx页面进行处理,这样才能进入source.aspx页面的Click事件;
    2. Click事件中,Response.Redirect(~/target.aspx)所作的事情实际上就是:
        2.1 将回复中Http报头的状态码改成302;
        2.1 指明302指向的页面就是target.aspx;
    3. 浏览器(用户代理)收到回复的报头信息后,
        3.1 将URL地址栏的地址改成target.aspx;
        3.2 向target.aspx发出请求

    和Response.Redirect()同样著名的是Server.Transfer()。但使用Server.Transfer,你会发现,页面对应的状态码是200,且地址栏的url并不会发生改变,仍然是source.aspx!这是因为Server.Transfer是完全在服务器端进行跳转的。所以一种很流行但我觉得不那么正确的说法就是:应当使用Server.Transfer()而不是Response.Redirect()来提高性能。因为在得到Server.Transfer()性能提升的同时,你应该权衡:性能的提高,和由此产生的代价。很难直接给出一个答案,这需要依靠具体的情景来做判断。但我倾向于尽量不使用Server.Transfer(),因为:1. 性能提升不大,节约的其实就是报头信息的往返;2. 清晰的URL无论对于终端用户,还是开发调试,都有很重要的作用。
            
    好了,理解了302,301也就好办了。302意味着重定向是暂时的,而301则是永久的重定向。
    就SEO而言,为了延续链接价值排除重复内容 ,我们在以下几种情况下都可能会用到301:
    1. 域名更换;
    2. 多个域名间映射;如www.freeflying.com和www.freeflying.cn,两个域名其实指向的是同一个网站,这就会造成大量的重复内容,对网站的排名不利。
    3. 清除默认索引页的重复问题:比如我们输入www.freeflying.com/article/时,如果在IIS里进行了设定,将指向www.freeflying.com/article/Default.aspx
    4. 其他的“不同域名相同内容”的重复问题,典型的就是URL重写后,www.freeflying.com/article/321.html和www.freeflying.com/article.aspx?id=321指向的其实都是同一个网页内容。

    对于404,最直观的理解就是页面不存在。如果网站是纯静态的,这很好理解;但当网站做成动态之后,如www.freeflying.com/article/321.html(映射为www.freeflying.com/article.aspx?id=321),虽然id=321的文章已经被删除了,或者根本不存在,但article.aspx这个页面始终是存在的,所以HTTP报头的状态码不会是404,而是200,表示请求成功。
    我们假设一个网站有id=321/342/6739……的文章都被删除了,但蜘蛛并不知道,它仍然会进行抓取,结果它发现,这些不同的URL对应的居然全是同一个页面。它就会将其当做重复页面进行处理。

    500意味着程序内部出现异常,比如3/0,代码如下:

        
    protected void Button1_Click(object sender, EventArgs e)
        {
            
    int i, j;
            i 
    = 8;
            j 
    = 0;
            
    this.Label1.Text = (i / j).ToString();
        }

    如果搜索引擎接到一个500的状态码时,搜索引擎会理解程序只是出现了暂时性的错误,它会在之后继续抓取,查看问题是否已经解决,这并不会给网站带来太大的问题——只要你能够尽快恢复。但是,Asp.net自带的个custom error的web.config配置,会让我们在不经意间“失误”。理由和上面讲到的404变200类似,当转向自定义的error.aspx之后,蜘蛛得到的是成功链接error.aspx的200代码,所以蜘蛛会以为报错的originpage.aspx正常的显示内容就是error.aspx的内容。不同url参数的originpage.aspx会被蜘蛛认为是不同的url,所以蜘蛛会认为这些所有的url都重复了——后果是很严重的。

    好了,认识到问题的严重性之后,我们来看解决问题的办法,太简单了,呵呵

        protected void Page_Load(object sender, EventArgs e)
        {
            
    //如果你希望搜索引擎知道这个url将不再使用
            Response.StatusCode = 404;

            
    //如果你希望告诉搜索引擎这个url只是出现了暂时的故障
            Response.StatusCode = 500;

            
    //如果你想永久重定向该页面
            Response.StatusCode = 301;
            Response.RedirectLocation 
    = @"\website1\target.aspx";
        }
          
  • 相关阅读:
    Java的静态块与实例块(转)
    Programming Ability Test学习 1031. Hello World for U (20)
    Programming Ability Test学习 1011. World Cup Betting (20)
    Programming Ability Test学习 1027. Colors in Mars (20)
    Programming Ability Test学习 1064. Complete Binary Search Tree (30)
    Programming Ability Test学习 1008. Elevator (20)
    【maven详解-生命周期】Maven的生命周期和插件
    【maven详解-插件】maven插件学习之源码插件Source Xref
    $(document).ready(){}、$(fucntion(){})、(function(){})(jQuery)onload()的区别
    你还没真的努力过,就轻易输给了懒惰
  • 原文地址:https://www.cnblogs.com/freeflying/p/1672308.html
Copyright © 2011-2022 走看看