HTTP学习(二)
Http学习(二)
参考文献:
[1]上野·宣.图解HTTP [M]北京:人民邮电出版社,2015.04;
目录:
1、常见的HTTP响应状态码:
2、常用的HTTP方法:
3、HTTP首部:
1、常见的HTTP响应状态码:
(1)状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误。
(2)状态码由三位数字和原因短语组成。
(3)状态码的第一位数字指定了响应类别,后面两位数字没有具体的分类。
响应类别有五种取值:
①–1xx:信息性状态码(Informational),接收的请求正在处理
②–2xx:成功状态码(Success),请求正常处理完毕
③–3xx:重定向状态码(Redirection),需要进行附加操作以完成请求
④–4xx:客户端错误状态码(Client Error),服务器无法处理请求
⑤–5xx:服务器端错误状态码(Server Error),服务器处理请求出错
(4)常见的状态码:
A)200 OK:
请求已正常处理
在响应报文内,随状态码一起返回的信息会因方法的不同而发生改变。当使用GET方法时,对应请求资源的实体会作为响应返回;当使用HEAD方法时,在响应中只返回首部,不会返回实体的主体部分。
B)204 No Content:
请求处理成功,但没有资源可返回
当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新。一般在只需要从客户端往服务器发送信息,而对客户端不需要发送新信息内容的情况下使用。
C)206 Partial Content:
对资源某一部分的请求
响应报文中包含由Content-Range指定范围的实体内容。
D)301 Moved Permanently:
永久性重定向
该状态码表示请求的资源已被分配了新的URI,以后应使用资源现在所指的URI。如果用户已经把资源对应的URI保存为书签了,则此时应该按Location首部字段提示的URI重新保存。
应用场景:
①开发中网站测试周期长,搜索引擎已收录测试的域名,搜公司名时,会打开测试地址;
②网站更换域名时,希望百度原来收录的域名点击之后直接打开新的域名;
③百度权重及排名分散在主域名和www子域名中,导致优化效果不好,需要把www子域名权重转化到主域名中。
实现301永久性重定向的方法:在apache环境下,开启rewrite模块,将客户新旧域名、主域名全部指向新站点,然后在新站点的根目录下创建.htaccess文件,并将下面的代码拷贝到.htaccess的所有规则之前(以某网站为例,测试地址为remoa.com,主域名为www.main.com)
Options +FollowSymlinks
RewriteEngine on
RewriteCond %{http_host} ^remoa.com [NC]
RewriteRule ^(.*)$ http://www.main.com/$1 [R=301,NC]
E)302 Found:
临时性重定向
请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问。新的URL会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。已移动的资源对应的URI将来还有可能发生改变。
F)303 See Other:
由于请求的资源存在另一个URI,希望客户端应使用GET方法定向获取请求的资源。
########
当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改为GET,并删除请求报文内的主体,之后请求会自动再次发送。
301、302标准是禁止将POST方法改变成GET方法的,但实际使用时大家都这么做。
########
G)304 Not Modified:
客户端发送附带条件的请求时,条件不满足时返回,与重定向无关。
304状态码返回时,不包含任何响应的主体部分。服务器端资源未改变,可直接使用客户端未过期的缓存。
H)307 Temporary Redirect:
临时重定向
与302类似,只是强制要求使用POST方法
I)400 Bad Request:
请求报文中存在语法错误,服务器无法识别
当错误发生时,需修改请求的内容后再次发送请求。另外,浏览器会像200 OK一样对待该状态码。
J)401 Unauthorized:
请求需要通过HTTP认证(BASIC认证、DIGEST认证)的认证信息
返回401的响应必须含有一个适用于被请求资源的WWW-Authenticate首部用以质询(challenge)用户信息。当浏览器初次接收到401响应,会弹出认证用的对话窗口。
K)403 Forbidden:
对请求资源的访问被服务器拒绝了
服务器通常会在响应正文中给出不提供服务的原因。未获得文件系统的访问授权,从未授权的发送源IP地址试图访问等情况都是发生403的原因。
L)404 Not Found:
服务器上无法找到请求的资源。
在服务器端拒绝请求且不想说明原因时也可使用404。
M)500 Internal Server Error:
服务器端在执行请求时发生了错误。也可能是Web应用存在的bug或某些临时的故障。
N)503 Service Unavailable:
服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
如果事先得知解除以上状况需要的时间,最好写入Retry-After首部字段再返回给客户端。
2、常用的HTTP方法:
(1)GET:获取资源
请求访问已被URI识别的资源。指定的资源经服务器端解析后返回响应内容。
如:使用百度搜索引擎搜索某个关键字,就是通过GET方法来请求的。
图2.1 GET请求
(2)POST:传输实体主体
用来传输实体的主体。
(3)PUT:传输文件
因为HTTP/1.1的PUT方法自身不带验证机制,所以存在安全性问题。若配合Web应用程序的验证机制,或架构设计采用REST标准的同类Web网站,才可能会开放使用PUT方法。
(4)HEAD:获得报文首部
用于确认URI的有效性及资源更新的日期时间等。
(5)DELETE:删除文件
按请求URI删除指定的资源。
当配合Web应用程序的验证机制,或遵守REST标准时还是有可能会开放使用的。
(6)OPTIONS:询问支持的方法
用来查询针对请求URI指定的资源支持的方法。
(7)TRACE:追踪路径
让Web服务器端将之前的请求通信环回给客户端的方法。
发送请求时,在Max-Forwards首部字段(最大传输逐跳数)中填入数值,每经过一个服务器端就将该数字减1,当数值刚好减到0时,就停止继续传输,最后接收到请求的服务器端则返回状态码200 OK的响应。
客户端通过TRACE方法可以查询发送出去的请求是怎样被加工修改/篡改的。请求想要连接到源目标服务器可能会通过代理中转,TRACE方法就是用来确认连接过程中发生的一系列操作。
但是TRACE方法容易引发XST跨站追踪攻击,所以通常不会用到。
(8)CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接字)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT方法的格式:
CONNECT 代理服务器名:端口号 HTTP版本
3、HTTP首部:
对来赛报名系统的login登录头部信息进行查看:
图3.1 首部信息查看
General通用首部字段:
图3.2 通用首部信息查看
Status Code:302 Found
请求的资源checklogin.action已被分配了新的URI,希望用户本次能使用新的URI访问。新的URL,person.action会在response中的Location中返回,浏览器将会使用新的URL发出新的Request。
图3.3 URL截图
Referrer Policy(推荐策略):
在页面引入图片、JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段。Referrer 在分析用户来源时很有用,有着广泛的使用。
2014 年,W3C 的 Web 应用安全工作组(Web Application Security Working Group)发布了Referrer Policy草案,对浏览器该如何发送 Referrer 做了详细的规定。
五种Referrer策略:
①No Referrer :任何情况下都不发送 Referrer 信息;
②No Referrer When Downgrade :仅当发生协议降级(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则是现在大部分浏览器默认所采用的;
③Origin Only :发送只包含 host 部分的 Referrer。启用这个规则,无论是否发生协议降级,无论是本站链接还是站外链接,都会发送 Referrer 信息,但是只包含协议 + host 部分(不包含具体的路径及参数等信息);
④Origin When Cross-origin :仅在发生跨域访问时发送只包含 host 的 Referrer,同域下还是完整的。它与Origin Only的区别是多判断了是否Cross-origin。需要注意的是协议、域名和端口都一致,才会被浏览器认为是同域;
⑤Unsafe URL :无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略;
图3.5 响应头
HTTP版本 + 状态码
响应首部字段:
Server:HTTP服务器软件名称
Location:令客户端重定向至指定URI
响应实体首部字段:
Content-Language:响应实体主体的语言
Content-length:响应实体主体的大小(单位:字节)
通用首部字段:
Date:原始服务器消息发出的时间
图3.6 请求头
请求方法 + URI + HTTP版本
请求首部字段:
Host:请求资源所在服务器
Content-length:请求实体主体的大小(单位:字节)
User-Agent:HTTP客户端程序的信息
Accept:用户代理可处理的媒体类型,即客户端能接收的内容类型
Referer:对请求中URI的原始获取方,即先前网页的地址,当前请求的网页紧随其后
Accept-Encoding:优先的内容编码,指定浏览器可以支持的web服务器返回内容压缩编码类型
Accept-Language:优先的语言,浏览器可接受的语言
Cookie:HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器
通用首部字段:
Connection:表示是否需要持久连接。HTTP1.1默认进行持久连接。
Cache-control:指定请求和响应遵循的缓存机制
Origin:只用于post请求,说明最初请求是从哪里发起的
Upgrade-Insecure-Requests:https需要加载http的资源,chrome告诉服务器,浏览器可以处理https协议,对于页面的http资源,请求时可以自动升级到https
实体首部字段:
Content-Type:请求实体对应的MIME信息
图3.7 表单数据
Form-data:表单数据
usermail:邮箱号
userpassword:用户密码
图3.8 登录表单截图