前言
在HTTP1.1规范中,新增了一个HTTP头信息:ETag;协商缓存。
作用
Etag是 Entity tag的缩写,可以理解为“被请求变量的实体值”,Etag是服务端的一个资源的标识,在 HTTP 响应头中将其传送到客户端。所谓的服务端资源可以是一个Web页面,也可以是JSON或XML等。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端。比如,浏览器第一次请求一个资源的时候,服务端给予返回,并且返回了ETag: “50b1c1d4f775c61:df3” 这样的字样给浏览器,当浏览器再次请求这个资源的时候,浏览器会将If-None-Match: W/“50b1c1d4f775c61:df3” 传输给服务端,服务端拿到该ETAG,对比资源是否发生变化,如果资源未发生改变,则返回304HTTP状态码,不返回具体的资源,节省服务器开销。比如七牛云就用到了ETag。
实现
php中间件
public function handle(Request $request, Closure $next)
{
$key = \Cache::get($request->getBaseUrl());
if ($key && $key === $request->header('If-None-Match')) {
return \response(null, 304)->header('ETag', $key);
}
$response = $next($request);
if ($key) {
$response->header('ETag', $key);
}
return $response;
}