建设网站专家,系统网站有哪些,wordpress 浮动二维码,搜索引擎优化分析一、关于http的206状态码和416状态码的意义及断点续传 HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据#xff0c;一般用来解决大文件下载问题#xff0c;一般CDN…一、关于http的206状态码和416状态码的意义及断点续传 HTTP 2xx范围内的状态码表明客户端发送的请求已经被服务器接受并且被成功处理了,HTTP/1.1 206状态码表示客户端通过发送范围请求头Range抓取到了资源的部分数据一般用来解决大文件下载问题一般CDN服务器都会支持这种能力。能否支持206只要看服务端响应头信息中是否存在 accept-ranges: bytes 这种头信息。accept-ranges: bytes表明服务器支持Range请求,以及服务器所支持的单位是字节(这也是唯一可用的单位).Content-Length响应头表明了响应实体的大小,也就是真实的视频等文件的大小如下即是995664字节。
accept-ranges: bytes
access-control-allow-origin: *
cache-control: max-age2592000
content-length: 995664
content-md5: Qj7WNfwWVjEqxqjP9Xv1DA
content-type: application/octet-stream 服务器支持accept-ranges: bytes即支持断点续传并且支持同时下载文件的各部分,即下载工具可以利用范围请求加速下载。而Accept-Ranges: none的情况下即表示响应头表示服务器不支持范围请求。对于支持断点续传的服务端客户端可以使用curl进行简单的测试比如我们有一张图片/uploads/pageimg/20200116164037_24480.png 通过请求查看是支持accept-ranges: bytes的总大小为Content-Length: 5798我们可以在linux下试验如下
rootnuser1-24:/opt# curl --header Range: bytes0-3000 /uploads/pageimg/20200116164037_24480.png -o part_a% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 3001 100 3001 0 0 10724 0 --:--:-- --:--:-- --:--:-- 10756
rootnuser1-24:/opt# curl --header Range: bytes3001- /uploads/pageimg/20200116164037_24480.png -o part_b% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed
100 2797 100 2797 0 0 18141 0 --:--:-- --:--:-- --:--:-- 18162
rootnuser1-24:/opt# sz part_a
rootnuser1-24:/opt# sz part_b
rootnuser1-24:/opt# cat part_a part_b part
rootnuser1-24:/opt# sz part 在下载下来的文件中part就是一个完整的图片而part_a图片可以打开使用windows下的画图软件即可并且能看到一半的图片part_b因为没有part_a中的图片头信息无法在windows查看到。 服务端要支持Accept-Ranges bytes也很简单nginx只需要在配置文件中添加下面这一行即可 add_header Accept-Ranges bytes; 416状态码是和206状态码相关联的一个状态码HTTP 416错误代表所请求的范围无法满足 (Requested Range not satisfiable)即请求的range值超过了文件的大小如下请求设置range为10000以上而实际文件大小不到6000就会报416错误
rootn67:/opt# curl -v --header Range: bytes10000- /uploads/pageimg/20200116164037_24480.png -o part_b% Total % Received % Xferd Average Speed Time Time Time CurrentDload Upload Total Spent Left Speed0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* Trying 114.215.80.214...
* Connected to www.007.cn (114.215.80.214) port 80 (#0)GET /uploads/pageimg/20200116164037_24480.png HTTP/1.1Host: www.007.cnUser-Agent: curl/7.47.0Accept: */*Range: bytes10000-HTTP/1.1 416 Requested Range Not SatisfiableServer: nginxDate: Fri, 17 Jan 2020 10:34:30 GMTContent-Type: text/htmlContent-Length: 206Connection: keep-aliveExpires: Sun, 16 Feb 2020 10:34:30 GMTCache-Control: max-age2592000Content-Range: bytes */5798{ [206 bytes data]
100 206 100 206 0 0 7045 0 --:--:-- --:--:-- --:--:-- 7103
* Connection #0 to host www.007.cn left intact 二、CORS使用Access-Control-Allow-Origin来允许跨域请求 因为浏览器的同源策略浏览器只允许请求当前域的资源而对其他域的资源以不信任的态度处理。JSONP是可以解决跨域的一些问题但JSONP只支持GET请求而不支持POST因此还是有限而使用Access-Control-Allow-Origin可以应对各种跨域请求。 CORS全称跨域资源共享Cross-origin resource sharing,这是W3C的标准即是使用Access-Control-Allow-Origin来允许跨域请求对这种请求也有标准的处理流程。 对于跨域的请求浏览器端先向目标服务器发送OPTION请求判断请求头中是否存在Access-Control-Allow-Origin头信息Access-Control-Allow-Origin是允许跨域请求的标志。如果没有浏览器就会报错No Access-Control-Allow-Origin header is present on the requested resource Access to XMLHttpRequest at https://007.cn/test/cross from origin https://007.com has been blocked by CORS policy: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 因为此时浏览器向目标服务器发送了OPTION请求并携带access-control-request-method和access-control-request-headers告诉目标服务器它的请求方式和所要发送的头信息检测目标服务器是否准许,示例如下
Request Method: OPTIONS
access-control-request-headers: content-type,cookies
access-control-request-method: POST 而如果这个OPTION请求未得到200响应的话则浏览器不会进行下一步。且会报错It does not have HTTP ok status Access to XMLHttpRequest at https://007.cn/test/cross from origin https://007.com has been blocked by CORS policy: Response to preflight request doesnt pass access control check: It does not have HTTP ok status。 即服务器必须在OPTION请求中响应200状态并且允许使用的headers和method。此时需要对目标服务器的nginx处理添加一些头信息如下不一定全部都需要。
add_header Access-Control-Allow-Origin https://007.com always;
add_header Access-Control-Allow-Headers Content-type,Origin,X-Auth-Token,X-JSON,Cookies,Cookie,Content-Length always;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS always;
add_header Access-Control-Allow-Credentials true always;
add_header Access-Control-Max-Age 86400 always; 需要注意的是Access-Control-Allow-Origin 可以设置为*但是如果设置为*则跨域请求不会携带cookie所以如果需要传输cookie还是需要有目的允许一些跨域来源地址。
Access-Control-Allow-Credentials表示允许携带认证信息cookies Access-Control-Allow-Methods 不必说可按需要开放哪些请求方式。 Access-Control-Allow-Headers 表示允许的请求头信息。比如如果这个字段中没有Cookie而同时又需要传输cookie的话就会报下面的错误 Access to XMLHttpRequest at https://007.cn/test/cross from origin https://007.com has been blocked by CORS policy: Request header field cookies is not allowed by Access-Control-Allow-Headers in preflight response。 这一步的OPTION请求OK的话浏览器才会正式执行跨域的请求。上面服务端响应头信息的时候注意看到最后都带了一个always标志。如果服务端修改后仍没有响应所需要的头信息的时候可以在最后加个always试试挺好用。