HTTP状态码和编程

来源:互联网 发布:微软雅黑字体 for mac 编辑:程序博客网 时间:2024/06/05 16:46

一 HTTP状态码

状态码
消息
描述
 
100
Continue
只有一部分请求被服务器接收,但只要没被服务器拒绝,客户端就会延续这个请求
 
101
Switching Protocols
服务器交换机协议
 
200
OK
请求被确认
 
201
Created
请求时完整的,新的资源被创建
 
202
Accepted
请求被接受,但未处理完
 
203
Non-authoritative Information
 
204
No Content
 
205
Reset Content
 
206
Partial Content
 
300
Multiple Choices
一个超链接表,用户可以选择一个超链接并访问,最大支持5个超链接
 
301
Moved Permanently
被请求的页面已经移动到了新的URL下
 
302
Found
被请求的页面暂时性地移动到了新的URL下
 
303
See Other
被请求的页面可以在一个不同的URL下找到
 
304
Not Modified
 
305
Use Proxy
 
306
Unused
已经不再使用此状态码,但状态码被保留
 
307
Temporary Redirect
被请求的页面暂时性地移动到了新的URL下
 
400
Bad Request
服务器无法识别请求
 
401
Unauthorized
被请求的页面需要用户名和密码
 
402
Payment Required
目前还不能使用此状态码
 
403
Forbidden
禁止访问所请求的页面
 
404
Not Found
服务器无法找到所请求的页面
 
405
Method Not Allowed
请求中所指定的方法不被允许
 
406
Not Acceptable
服务器只能创建一个客户端无法接受的响应
 
407
Proxy Authentication Required
在请求被服务前必须认证一个代理服务器
 
408
Request Timeout
请求时间超过了服务器所能等待的时间,连接被断开
 
409
Conflict
请求有矛盾的地方
 
410
Gone
被请求的页面不再可用
 
411
Length Required
"Content-Length"没有被定义,服务器拒绝接受请求
 
412
Precondition Failed
请求的前提条件被服务器评估为false
 
413
Request Entity Too Large
因为请求的实体太大,服务器拒绝接受请求
 
414
Request-url Too Long
服务器拒绝接受请求,因为URL太长。多出现在把"POST"请求转换为"GET"请求时所附带的大量查询信息
 
415
Unsupported Media Type
服务器拒绝接受请求,因为媒体类型不被支持
 
417
Expectation Failed
 
500
Internal Server Error
请求不完整,服务器遇见了出乎意料的状况
 
501
Not Implemented
请求不完整,服务器不提供所需要的功能
 
502
Bad Gateway
请求不完整,服务器从上游服务器接受了一个无效的响应
 
503
Service Unavailable
请求不完整,服务器暂时重启或关闭
 
504
Gateway Timeout
网关超时
 
505
HTTP Version Not Supported
服务器不支持所指定的HTTP版本


 
HTTP请求与HTTP响应的格式相近,都有着如下结构:
 以状态行+CRLF(回车换行)开始
 零行或多行头模块+CRLF
 一个空行,比如CRLF
 可选的消息体比如文件,查询数据,查询输出
 
举例来说,一个服务器响应头看起来就像下面这样:
HTTP/1.1 200 OK
Content-Type: text/html
Header2: ...
...
HeaderN: ...
  (Blank Line)
<!doctype ...>
<html>
<head>...</head>
<body>
...
</body>
</html>
状态行包含HTTP版本,一个状态码,和状态码相对应的短消息。

三 JSP对HTTP状态码的编程
<一>
HttpServletResponse 类中用来设置状态码的方法:
 
方法 & 描述

1
public void setStatus ( int statusCode )
 此方法可以设置任意的状态码。如果您的响应包含一个特殊的状态码和一个文档,请确保在用PrintWriter返回任何内容前调用setStatus方法

2
public void sendRedirect(String url)
 此方法产生302响应,同时产生一个 Location 头告诉URL 一个新的文档

3
public void sendError(int code, String message)
 此方法将一个状态码(通常为 404)和一个短消息,自动插入HTML文档中并发回给客户端

<二> HTTP状态码程序示例

 例子将会发送407错误码给浏览器,然后浏览器将会告诉您"Need authentication!!!"。

 <html><head><title>Setting HTTP Status Code</title></head><body><%   // 设置错误代码,并说明原因   response.sendError(407, "Need authentication!!!" );%></body></html>

 

四 Asp.Net对HTTP状态码的编程
每次当用户代理(可以理解为就是IE和Firefox)向Web站点请求一个URL地址,服务器都会给予回复,回复内容包括两部分:HTTP报头,和被请求的内容。但仅从浏览器上我们通常只能看到内容而看不到报头信息。所以,我们需要通过一些浏览器插件来观察他们。IE用

WebDeveloper;FireFox用Fiddler。

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

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。

客户端/服务器之间往返的过程其实是这样的:
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则是永久的重定向。
就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";    }



 

0 0
原创粉丝点击