邢栋博客

邢栋博客,Action博客,记录工作和生活中的点点滴滴

http的request和response介绍
http请求
http request

1.request line
GET   /dir/1.html      HTTP/1.1
请求方法  资源位置 协议版本

2.HTTP HEADERS
通用header 请求header 实体 header

3.Content


request method
HTTP/1.1规范中的8个请求方法
1.GET      url长度有限制
2.POST 
3.HEAD
4.PUT  //201
5.DELETE
6.TRACE
7.OPTIONS
8.CONNECT



request headers
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
参数为 Content Type
q指定优先级[0-1],为不接受,默认为1
如果不指定*/*,则其他类型优先级为0

Accept-Encoding: gzip, deflate 

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

Authorization:
Basic
%%%%%%%%%%%%%%%%%

401 Unauthorized

Cookie:
version=1;skin=new;


Cache-Control: 
max-age=0

Host:
www.xingdong365.com

If-Match:
"aetaghdsfsdaf"

If-Modified-Since:
Sun,11 May 2018 08:30:44 GMT

If-None-Match:
"aetaghdsfsdaf"

If-Range:
"aetaghdsfsdaf"

If-Unmodified-Since:
Sun,11 May 2018 08:30:44 GMT

Referer:
http://xingdong365.com

Range:
bytes=0-499,1000-

Upgrade:
HTTP/2.0

Via:
192.168.0.26,example.com

X-Requested-With: //是否是ajax请求
XMLHttpRequest  

X-Forwarded-For:  //代理服务器转发
client1,proxy1,192.168.0.128



http response 

1.Status line
HTTP/1.1 200 OK

100-199:参考信息
200-299:成功
300-399:重定向
400-499:客户端错误
500-599:服务器错误

200 OK 一切ok
GET /index.html HTTP/1.1

201 Created 已创建 通常伴随 Location Header 返回 
PUT /a-new-doc.html HTTP/1.1

206 Partial Content 片段内容 
GET /large.zip HTTP/1.1
Range:bytes0-500

301 Moved Permanently 永久重定向 已永久移动到其他位置,配合location使用
seo适用,无结尾/请求目录时也会自动产生此响应
GET /beauty HTTP/1.1

302 Found 找到了 临时跳转
按HTTP规范,客户端此时应使用和导致产生此响应的请求方法 同样的方法再次请求Location指定位置的资源
在实践中,绝大多数浏览器都一律使用get请求location中指定的资源

304 Not Modified 未修改,无变动(用缓存中的)
Date:..........
ETag:"........"
GET /beauty HTTP/1.1
If-None-Match:"......."
If-Modified-Since:............

400 Bad Request 请求错误 打开的方式不对
401 Unauthorized 未被授权 浏览器收到此响应弹出一个输入用户名 密码的对话框
403 Forbidden 禁止访问
404 not found
405 Method not Allowed  
访问方法不对 服务器禁止以所请求的方法访问,同时一般会通过allow告知允许的方法 
Allow:GET,POST
406 Not Acceptable 无法接受
当请求中的accept系列header中列出的条件无法满足时,会产生此响应
GET / HTTP/1.1
Accept:application/json
408 Request timeout 请求超时 服务器一直没遇到 connection:close 会产生此响应并关闭连接

500 Internal Server Error 服务器错误
502 Bad Gateway 网关错误 代理服务器从上游服务器收到一个无效响应时,会给客户端返回此响应
503 service Unavailable 服务暂时不可用
504 Gateway Timeout 网关超时。代理服务器无法在限定时间内从上游服务器收到一个响应 


2.HTTP headers
通用header 响应header 实体header

ETag:"aetaghdsfsdaf"
Location:http://xingdong365.com
Refresh:3;url=http://xingdong365.com
Set-Cookie:........
Vary:Accept-Language,User-Agent

3.Content
<html>....</html>


http性能优化 performance

缓存
cache-control If-Modified-Since  ETag

cache-control 缓存策略
 max-age=600,no-cache="Set-Cookie"

no-cache="xxx" 缓存,但在发回客户端先做检查,传值则表示不缓存指定的header
no-store 不缓存任何内容,在ie中=no-cache
max-age=120 缓存最大有效期,单位秒(age response header)
max-stale=600 在缓存过期后还可以继续保存600秒,不赋值则表示可一直有效
no-transform 禁止缓存代理修改内容
only-if-cached 禁止缓存代理访问应用服务器,仅在有缓存时返回内容
public 任何客户端(代理服务器或浏览器)均可缓存
private 仅限私有客户端(一般是浏览器)可缓存内容
must-revalidate 必须重新验证缓存有效性(默认行为),此指令目的在于显示指明
proxy-revalidate 代理服务器需要重新验证缓存有效期,浏览器不需要
s-maxage 指定public 客户端上的maxage,private可忽略


第一次请求:服务器响应
Last-Modified : 时间A
第二次请求,附加header,检查是否从上次修改时间点后有过新的修改
If-Modified-Since:时间A

ETag:If-None-Match

Vary:Accept-Encoding
告知缓存代理服务器,客户端请求中发送了不同的Accept-Encoding就要缓存不同的版本

php实现http401授权
<?php

//unset($_SERVER['PHP_AUTH_DIGEST']);

$username = 'xingdong'; //用户名
$userpass = '123456'; //面膜
$secret = 'xingdong365'; //秘钥

$realm = '401test';

$opaque = md5($secret.$_SERVER['HTTP_USER_AGENT'].$_SERVER['REMOTE_ADDR']);

if (!isset($_SERVER['PHP_AUTH_DIGEST']) || empty($_SERVER['PHP_AUTH_DIGEST'])) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.$opaque.'"');
    die;
}

$needed_parts = array(
    'nonce'    => 1,
    'nc'       => 1,
    'cnonce'   => 1,
    'qop'      => 1,
    'username' => 1,
    'uri'      => 1,
    'response' => 1
);

$data = array();
$keys = implode('|', array_keys($needed_parts));

preg_match_all('/('.$keys.')=(?:([\'"])([^\2]+?)\2|([^\s,]+))/', $_SERVER['PHP_AUTH_DIGEST'], $matches, PREG_SET_ORDER);

foreach ($matches as $m) {
    $data[$m[1]] = $m[3] ? $m[3] : $m[4];
    unset($needed_parts[$m[1]]);
}

//检测用户名
if ($data['username'] != $username){
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.$opaque.'"');
    die('Invalid username.');
}

$password = md5($username.':'.$realm.':'.$userpass);

$response = md5($password.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']));



if ($data['response'] != $response) {
    header('HTTP/1.1 401 Unauthorized');
    header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.$opaque.'"');
    die('Invalid password.');
}


echo "success";


优惠券
广告位-淘宝
最新微语