1.http介绍
HTTP是一个 客户端和 服务器端请求和应答的标准(TCP)。客户端是终端用户,服务器端是网站。通过使用 Web浏览器、 网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认 端口为80)的HTTP请求。(我们称这个客户端)叫用户代理(user agent)。应答的服务器上存储着(一些)资源,比如HTML文件和图像。(我们称)这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个中间层,比如代理,网关,或者隧道(tunnels)。尽管 TCP/IP协议是互联网上最流行的应用,HTTP协议并没有规定必须使用它和(基于)它支持的层。 事实上,HTTP可以在任何其他互联网协议上,或者在其他网络上实现。HTTP只假定(其下层协议提供)可靠的传输,任何能够提供这种保证的协议都可以被其使用
通常,由HTTP客户端发起一个请求,建立一个到服务器指定端口(默认是 80端口)的TCP连接。HTTP服务器则在那个端口监听客户端发送过来的请求。一旦收到请求,服务器(向客户端)发回一个状态行,比如”HTTP/1.1 200 OK”,和(响应的)消息,消息的消息体可能是请求的文件、错误消息、或者其它一些信息
HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正
通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform Resource Identifiers)(或者,更准确一些,URLs)来标识
2.http特点
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快
支持客户/服务器模式
3.http版本
http0.9
1991年发布的0.9版,该版本只有一个命令Get。
GET/index.html,这条命令表示,TCP 连接建立以后,客户端向服务器请求(request)网页index.html。
协议规定,服务器只能回应HTML格式的字符串,不能回应别的格式
http1.0
1996年5月,HTTP/1.0 版本发布,引入了POST命令和HEAD命令,新增了一些功能包括状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等(详见 RFC1945)
http1.1
1997年1月,HTTP/1.1 版本发布,该版本中,持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度
HTTP/1.1相较于 HTTP/1.0 协议的区别主要体现在
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性
http2.0
2015发布了HTTP/2版本,因为不再继续发布子版本,所以下一个版本将为HTTP/3,而不是2.1。
HTTP/1.1版的头信息肯定是文本(ASCII编码),数据体可以是文本,也可以是二进制。HTTP/2 则是一个彻底的二进制协议,头信息和数据体都是二进制,并且统称为”帧”(frame):头信息帧和数据帧。
二进制协议的一个好处是,可以定义额外的帧。HTTP/2 定义了近十种帧,为将来的高级应用打好了基础。如果使用文本实现这种功能,解析数据将会变得非常麻烦,二进制解析则方便得多
HTTP/2: the Future of the Internet | Akamai
4.用户访问网站流程
用户输入url域名
DNS解析:查找域名对应的ip地址(获得域名对应的ip地址)
tcp3次握手:用户通过ip地址与对应的服务器建立连接(与服务器连接)
http请求报文:建立tcp连接后,用户向服务器索要指定的内容(页面,图片,视频….) (向服务索要内容)
服务器通过查找
http响应报文: 找到后把用户要的内容,返还给用户(服务型响应用户)
tcp4次挥手: 用户与服务器断开连接
什么是url
url:就是我们平时说的“网址”
什么是pv
PV是page view的缩写,即页面浏览量,通常是衡量一个网络新闻频道或网站一条网络新闻的主要指标;网页浏览数是评价网站流量最常用的指标之一
什么是uv
UV是unique visitor的简写,一般指独立访客
独立访客就是独立访客,一般地,我们可以用两个数值标准来统计访问某网站的访客,即访问次数和独立访客数,访问次数和独立访客数是两个不同的概念
DNS解析
在浏览器中输入一个网址,是不能直接用来进行连接的,因而就要使用dns地址解析将输入的URL网址转换为IP地址
具体的查找过程和策略可以分为下面这几步
1.在浏览器中输入 域名 ,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就像调用这个IP映射,完成域名解析
2.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有 直接返回,完成解析
3.如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找到TCP/IP参数中设置的首选DNS服务器,在此,我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,此解析具有权威性
4.如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已经缓存了网址映射关系,则调用这个ip地址映射,完成域名解析,此解析不具有权威性
5.如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,DNS服务器收到请求后,会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的IP。本地DNS服务器收到IP信息后,将会联系负责.com域名的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找到一个管理.com下一级DNS服务器地址(baidu.com)给本地DNS服务器,当本地DNS服务器收到这个地址后,就会找google.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机 (6) 如果用的是转发模式,此DNS服务器就会吧请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或着根DNS把转请求至上上级,以此循环。不管是本地DNS服务器用还是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机
建立TCP协议三次握手过程
好了经过DNS解析,现在我们指定了百度服务器地址,可以访问它。约会也得先发个邀请吧,网络也是一样,先建立连接,才可以传输数据
简单 说明TCP协议
IP协议定义 了一套自己的地址规则,称为IP地址,它实现了路由功能,允许某个局域网的A主机 ,向另一个局域网的B主机发送消息。IP协议 只是地址协议,并不保证数据包的完整。如果 路由器丢包(比如缓存满了,新进来的数据包就会丢失),就需要发现丢了哪一个包,以及如何重新发送这个包,这就要依靠TCP协议。简单说,TCP协议的作用是,保证数据通信的完整性和可靠性,防止丢包
TCP三次握手建立过程简单说明
1.由客户端(用户)发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的。
并且还将报文中SYN字段置为1,表示需要建立TCP连接请求。
2.服务端(就是百度服务器)会回复客户端(用户)发送的TCP连接请求报文,其中包含seq序列号,也是由回复端随机生成的,
并且将回复报文的SYN字段置1,而且会产生ACK验证字段,ACK验证字段数值是在客户端发过来的seq序列号基础上加1进行回复:
并且还会回复ack确认控制字段,以便客户端收到信息时,知晓自己的TCP建立请求已得到了确认。
3.客户端收到服务端发送的TCP建立请求后,会使自己的原有序列号加1进行再次发送序列号,并且再次回复ACK验证请求,在B端发送过来的seq基础上加1,进行回复;同时也会回复ack确认控制字段,以便B收到信息时,知晓自己的TCP建立请求已经得到了确认
客户端发出访问网站相应页面请求(发出http协议请求报文)
建立连接后,发送请求报文,想看什么数据。输入www.baidu.com时,默认请求的是index.html首页文件
请求报文结构:
2.请求头:
3.空行:
4.请求主体:get方法没有请求主体内容 post方法会有请求主体信息
HTTP请求方法:GET方法与POST方法
GET方法
GET方法是默认的HTTP请求方法,我们日常用GET方法来提交表单数据,然而用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向Web服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如 Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=�%E+�� 从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于 GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大
POST方法
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法
服务端发出相应访问页面的请求信息(发出http响应报文)
应答 web服务器收到这个请求,进行处理。从它的文档空间中搜索子目录mydir的文件index.html。如果找到该文件,Web服务器把该文件内容传送给相应的Web浏览器。为了告知浏览器,Web服务器首先传送一些HTTP头信息,然后传送具体内容(即HTTP体信息),HTTP头信息和HTTP体信息之间用一个空行分开
1.起始行(响应行)
①. HTTP协议版本信息
②. 响应的状态码信息(请求成功状态码 200)
③. 响应状态码说明信息
2.响应头部:
3.空行:
4.响应主体内容:一般为html css js 等等代码信息
协议状态代码描述HTTP响应的第一行类似于HTTP请求的第一行,它表示通信所用的协议是HTTP1.1服务器,已经成功处理的客户端发出的请求(200表示成功)
HTTP/1.1 200 OK
响应头(Response Header) 响应头也和请求头一样包含许多有用的信息,例如服务器类型,日期时间、内容类型和长度等
响应正文就是服务器返回的HTML页面
响应头和正文之间也必须用空行分割
断开TCP协议四次挥手过程
当客户端和服务器通过三次握手建立TCP连接之后,当数据传送完毕,肯定是要断开TCP连接的,那对于TCP断开连接,这里就有了四次挥手
第一次挥手:Client 发送一个Fin,用来关闭Client和Server的数据传送,Client进入Fin_Wait—_1状态
第二次挥手:Server收到Fin后,发送一个Ack给Client,确认序号为收到的序号+1(与Syn相同,一个Fin占用一个序号),Server进入Close_Wait转态。
第三次挥手:Server发送一个Fin,用来关闭Server到Client的数据传送,Server进入Last_Ack转态。
第四次挥手:Client 收到Fin后,Client进入Time_Wait 转态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入Close转态,完成四次挥手
5.http协议详解
http协议请求与响应

http请求报文
systemctl start nginx

HTTP响应头和请求头信息对照表
HTTP请求头提供了关于请求,响应或者其他的发送实体的信息。HTTP的头信息包括通用头、请求头、响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成
通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联。
请求头标:允许客户端传递关于自身的信息和希望的响应形式。
响应头标:服务器和于传递自身信息的响应。
实体头标:定义被传送资源的信息。即可用于请求,也可用于响应
请求报文起始行
HTTP方法 | 作用描述 |
GET | 客户端请求指定资源信息,服务器返回指定资源 |
HEAD | 只请求响应报文中的HTTP首部 |
POST | 将客户端的数据提交到服务器,例:注册表单 |
PUT | 从客户端向服务器传送的数据取代指定的文档内容 |
DELETE | 请求服务器删除Request-URI所标识的资源 |
MOVE | 请求服务器将指定的页面移至另一个网络地址 |
请求头
Header | 解释 | 示例 |
Host | 你访问的域名或ip(你的目标网站) | Host: www.zcmhi.com |
User-Agent | 使用的浏览器(使用的什么代理),用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户端使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等 | User-Agent: Mozilla/5.0 (Linux; X11) |
Accept | 指定客户端能够接收的内容类型,如常见的 text/html 等,最后返回的百度首页也是个 HTML 文件 | Accept:text/plain, text/html |
Accept-Encoding | 表示浏览器有能力解码的编码类型 | Accept-Encoding: compress, gzip |
Accept-Language | 表示浏览器所支持的语言类型。(这里指中文、简体中文和英文) | Accept-Language: en,zh |
Cache-Control | 指定请求和响应遵循的缓存机制。(这里表示不需要缓存) | Cache-Control: no-cache |
Connection | 表示是否需要持久连接。(HTTP 1.1 默认进行持久连接即为 keep-alive, HTTP 1.0 则默认为 close) | Connection: close |
Cookie | HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 | Cookie: $Version=1; Skin=new; |
Content-Length | 请求的内容长度 | Content-Length: 348 |
Referer | 先前访问的网页的地址,当前请求网页紧随其后,说明你是先前是从哪个网址点击访问到该页面的,如果没有则不填 | Referer: http://www.zcmhi.com/archives/71.html |
Content-Type | 内容的类型,GET 请求无该字段,POST 请求中常见的有 application/x-www-form-urlencoded 为普通的表单提交,还有文件上传为 multipart/form-data | Content-Type: application/x-www-form-urlencoded |
Accept-Charset | 浏览器可以接受的字符编码集 | Accept-Charset: iso-8859-5 |
Accept-Ranges | 可以请求网页实体的一个或者多个子范围字段 | Accept-Ranges: bytes |
Authorization | HTTP授权的授权证书 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Date | 请求发送的日期和时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Expect | 请求的特定的服务器行为 | Expect: 100-continue |
From | 发出请求的用户的Email | From: user@email.com |
If-Match | 只有请求内容与实体相匹配才有效 | If-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Modified-Since | 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 | If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
If-None-Match | 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
If-Range | 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag | If-Range: “737060cd8c284d8af7ad3082f209582d” |
If-Unmodified-Since | 只在实体在指定时间之后未被修改才请求成功 | If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT |
Max-Forwards | 限制信息通过代理和网关传送的时间 | Max-Forwards: 10 |
Pragma | 用来包含实现特定的指令 | Pragma: no-cache |
Proxy-Authorization | 连接到代理的授权证书 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
Range | 只请求实体的一部分,指定范围 | Range: bytes=500-999 |
Referer | 先前网页的地址,当前请求网页紧随其后,即来路 | Referer: http://www.zcmhi.com/archives/71.html |
TE | 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 | TE: trailers,deflate;q=0.5 |
Upgrade | 向服务器指定某种传输协议以便服务器进行转换(如果支持) | Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11 |
Via | 通知中间网关或代理服务器地址,通信协议 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 关于消息实体的警告信息 | Warn: 199 Miscellaneous warning |
请求报文空行
这是个空行
请求报文主
一般是POST的请求方法才有,主体内容
6.http响应报文
状态码
2xx | 正常 |
3xx | 正常,跳转 |
4xx | 故障,用户 |
5xx | 故障,服务端 |
常见状态码
状态代码 | 详细描述说明 |
200 – OK | 服务器成功返回网页,这是成功的http请求,返回的标准状态码 |
301 – Moved Permanently | 永久跳转,所有请求的网页将永久跳转到被设定的新的位置,例如:从etiantian.org跳转到www.etiantian.org |
302 | 临时跳转 |
403 – Forbidden | 禁止访问,这个请求是合法的,但是服务器端因为匹配了预先设置的规则而拒绝响应客户端的请求,此类问题一般为服务器或服务权限配置不当所致。Nginx 403 forbidden多种原因及故障模拟重现 403问题精彩总结 |
404 – Not Found | 服务器找不到客户端请求的指定页面,可能是客户端请求了服务器上不存在的资源导致 |
500 – Internal Server Error | 内部服务器错误,服务器遇到了意料不到的情况,不能完成客户的请求。这是一个较为笼统的报错,一般为服务器的设置或者内部程序问题导致。例如:SElinux开启,而又没有为http设置规则许可,客户端访问就是500 |
502 – Bad Gateway | 坏的网关,一般是代理服务器请求后端服务时,后端服务不可用或没有完成响应网关服务器。一般为反向代理服务器下面的节点出问题导致。 中介,迎宾—-无法与后面的服务器联系 |
503 – Service Unavailable | 服务当前不可用,可能因为服务器超载或停机维护导致,或者是反向代理服务器后面没有可以提供服务的节点 |
504 – Gateway Timeout | 网关超时,一般是网关代理服务器请求后端服务时,后端服务没有在特定的时间内完成处理请求,一般是服务器过载导致没有在指定的时间内返回数据给前端代理服务器 |
2xx状态码
状态代码 | 详细描述说明 |
201(已创建) | 请求成功并且服务器创建了新的资源 |
202(已接受) | 服务器已接受请求,但尚未处理 |
203(非授权信息) | 服务器已成功处理了请求,但返回的信息可能来自另一来源 |
204(无内容) | 服务器成功处理了请求,但没有返回任何内容 |
205(重置内容) | 服务器成功处理了请求,但没有返回任何内容 |
206(部分内容) | 服务器成功处理了部分 GET 请求 |
3xx状态码
状态代码 | 详细描述说明 |
300(多种选择) | 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择 |
303(查看其他位置) | 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码 |
304(未修改) | 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容 |
305(使用代理) | 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理 |
307(临时重定向) | 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求 |
4xx状态码
状态代码 | 详细描述说明 |
400(错误请求) | 服务器不理解请求的语法 |
401(未授权) | 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应 |
405(方法禁用) | 禁用请求中指定的方法 |
406(不接受) | 无法使用请求的内容特性响应请求的网页 |
407(需要代理授权) | 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理 |
408(请求超时) | 服务器等候请求时发生超时 |
409(冲突) | 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息 |
410(已删除) | 如果请求的资源已永久删除,服务器就会返回此响应 |
411(需要有效长度) | 服务器不接受不含有效内容长度标头字段的请求 |
413(请求实体过大) | 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力 |
414(请求的 URI 过长) | 请求的 URI(通常为网址)过长,服务器无法处理 |
415(不支持的媒体类型) | 请求的格式不受请求页面的支持 |
416(请求范围不符合要求) | 如果页面无法提供请求的范围,则服务器会返回此状态代码 |
417(未满足期望值) | 服务器未满足”期望”请求标头字段的要求 |
5xx状态码
状态代码 | 详细描述说明 |
501(尚未实施) | 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码 |
505(HTTP 版本不受支持) | 服务器不支持请求中所用的 HTTP 协议版本 |
响应头
Header | 解释 | 示例 |
Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12 |
Allow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD |
Cache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache |
Content-Encoding | web服务器支持的返回内容压缩编码类型 | Content-Encoding: gzip |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Length | 响应体的长度 | Content-Length: 348 |
Content-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm |
Content-MD5 | 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
Date | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
ETag | 请求变量的实体标签的当前值 | ETag: “737060cd8c284d8af7ad3082f209582d” |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
Location | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.zcmhi.com/archives/94.html |
Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic |
refresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | Refresh: 5; url= http://www.zcmhi.com/archives/94.html |
Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120 |
Server | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 设置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards |
Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked |
Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: * |
Via | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic |