WEB-HTTP基础

— 从零开始的笔记 —
— HTTP基础知识 —

前言

emmm…终于系统地整理了一下经常看到但是没有去好好了解的HTTP的东西,那么开始。

HTTP结构

请求结构

HTTP版本有两种:1.0 和 1.1
我们需要注意到的差异是 1.1版本请求必须使用HOST请求消息头

响应结构

http全路径与相对路径地址

常用的相对路径访问形式

1
2
GET /tokens/data HTTP/1.1
Host: mhbtest.zsins.com

同样可以使用的绝对路径访问形式

1
2
3
GET https://core.zsins.com:443/cas/images HTTP/1.1
Host: baidu.com
X-Forwarded-Host: baidu.com

以上两种地址形式的区别是:

  • 前者的host头修改后,服务器解析会报错;
  • 后者的host头修改后,服务器会正常解析;

可用于host绕过。但是这个结论不是一定的,自己是在nginx中发现上面规律,实际情况跟web服务器、版本均有关。

常用HTTP消息头部

先给出一些通用的消息头

1
2
3
4
5
Connection:HTTP传输后是关闭TCP链接,还是保持链接开放
Content-Length:消息主体字节长度
Content-Type:消息主体内容类型;HTML文档内容类型为text/html
Content-Encoding:为消息主体内容指定编码形式(如gzip);一些应用使用它来压缩主体,以加快传输速度
Transfer-Encoding:为方便通过HTTP传输而对消息主体使用的任何编码。使用这个消息头,通常用它指定块编码

HTTP请求消息头部

下面开始说明HTTP请求消息部分,先从消息头部开始:

1
2
3
4
5
6
7
8
9
10
User-Agent:UA,用户代理,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
Referer:表示发出请求的原始URL,跳转
Host:想访问的WEB服务器的域名/IP 地址和端口号
Accept:客户端可以处理的媒体类型,按优先级排序;在一个以逗号为分隔的列表中,可以定义多种类型和使用通配符。
Accept-Charset:客户端接收的字符集
Accept-Encoding: 客户端愿意接受哪些内容编码
Authorization:用于为一种内置HTTP身份验证向服务器提交证书
Cookie:提交服务器向客户端发布的其他参数
If-Modified-Since:用于说明浏览器最后一收到所请求的资源的时间。如果服务器判断资源没有发生变化,就会发送状态码304响应,是客户端使用缓存的资源副本
If-None-Match:指定一个实体标签——消息主体内容的标识符;服务器可以使用实体标签确定浏览器是否使用资源的缓冲副本

User-Agent延伸

补充参考1 补充参考2
IOS6系统格式:
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25
safari5.1–Windows格式:
User-Agent: Mozilla/5.0(Windows;U;WindowsNT6.1;en-us)AppleWebKit/534.50(KHTML,likeGecko)Version/5.1Safari/534.50

伪造IP的HTTP请求头:

X-Forwarded-For
Client-IP
x-remote-IP
x-originating-IP
x-remote-addr

HTTP请求头方法

GET:获取资源,
POST:传输实体内容,之后细说
PUT:上传文件,传输文件到请求URL的位置。自身不带验证机制,存在安全性问题,需要关注。
DELETE:删除文件,删除请求URL位置的文件,与上同
HEAD:返回和GET一样的头,不返回主体;用于检查某一资源是否存在
TRACE:返回服务器接受到的请求头;用于检测客户端与服务器之间是否存在任何操纵请求的代理服务器
    有Max-Forward首字段:可以控制生存时间STEP
CONNECT:链接至HTTP代理服务器,[详细说明](http://blog.csdn.net/kobejayandy/article/details/24606521)
OPTIONS:返回服务器对特定资源可用的HTTP方法

POST方法的Content-Type的常用四种形式

通过HTNL的Form表单的Enctype属性指定使用的常用四种形式
application/x-www-form-urlencoded
multipart/form-data
application/json
text/xml
除此以外还有
application/x-java-serialized-object : java序列化
application/x-amf:Flash序列化
application/soap+msbin1:Silverlight序列化

application/x-www-form-urlencoded :

数据被编码为名称/值对

POST http://www.example.com HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8

title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3 

multipart/form-data :

可以使一块内容进行不同的编码形式
格式:Content-Type:multipart/form-data; boundary=(+随机的分割字符串)

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA-- 

分割开头多-- 最后一个结尾多--

application/json :

主体是序列化后的 JSON 字符串

POST http://www.example.com HTTP/1.1
Content-Type: application/json;charset=utf-8

{"title":"test","sub":[1,2,3]} 

text/xml :

以纯文本形式进行编码,其中不含任何控件或格式字符。

POST http://www.example.com HTTP/1.1
Content-Type: text/xml

<!--?xml version="1.0"?-->
<methodcall>
    <methodname>examples.getStateName</methodname>
    <params>
        <param>
            <value><i4>41</i4></value>

    </params>
</methodcall> 

HTTP响应消息头部

1
2
3
4
5
6
7
8
9
10
11
12
13
Server:指明WEB服务器软件
Set-Cookie:发送一个cookie,分号分割,它将在随后向服务器发送的请求汇总由Cookie消息头返回
可选属性:
expires:设定cookie有效时间。使浏览器将cookie保存在永久性的存储器中,在随后的的浏览器会话中重复利用,直到到期。
domain:用于指定cookie有效域。这个域必须和收到cookie的域相同或者是它的父域
path:用于指定cookie的有效url路径
secure:设置,仅仅只在HTTPS请求中提交cookie
HttpOnly:无法通过客户端JS直接访问cookie
Pragma:主要用于no-cache,浏览器不要将响应保存在缓存中
Cache-Control:设置是否要缓存,及缓存的设置
Expired:WEB服务器表明该实体将在什么时候过期
ETag:指定一个实体标签,标志为实体的版本
Location:服务器告诉浏览器,试图访问的对象已经被移到别的位置了,到该头部指定的位置去取。

HTTP响应返回状态码

  • 1XX——提供信息
  • 2XX——请求被成功提交
  • 3XX——客户端被重定向到其他资源
  • 4XX——请求包含某种错误
  • 5XX——服务器执行请求是遇到错误
100 Continue——当客户端发送包含主体的请求,服务端返回100,表示已经收到请求消息头,让客户端继续发送主体。

200 OK——已经成功提交请求,且响应主体中包含请求的结果。
201 Created——PUT请求的响应返回状态码,表示请求已成功提交

301 Moved Permanently——重定向到Location消息头中指定的URL,以后客户端应用新的URL替换原始的URL
302 Found——暂时重定向到Location消息头中指定的URL,随后请求中恢复使用原始URL
304 Not Modified——指示浏览器使用缓存中保存的所请求资源的副本。

400 Bad Request——表示客户端提交了一个无效的HTTP请求。
401 Unauthorized——服务器在许可请求前要求HTTP进行身份验证。身份验证类型在消息头WWW-Authenticate中说明
403 Forbidden——不管是否通过身份验证,禁止任何人访问被请求的资源
404 Not Found——所请求的资源不存在
405 Method Not Allowed——URL不支持请求中使用的方法,如不支持PUT
413 Request Entity Too Large——表示请求主体过长,服务器无法处理
414 Request URI Too long——表示请求中URL过长,服务器无法处理

500 InternalServer Error——表示服务器在执行请求时遇到错误。
503 Service Unavailable——尽管WEB服务器运转正常,能够响应请求,但是服务器访问的应用程序无法做出响应。

HTTP身份验证

在组织内部经常使用来访问内联网服务,但因特网上的Web应用程序很少使用

  • Basic: 在请求消息头中,用户证书以Base64的形式编码发送服务器
  • NTLM: 质询-响应式机制,使用某个windows NTLM协议版本
  • Digest: 质询-响应式机制,随同用户证书一起使用一个随机值MD5校验和。