如何在 Laravel 中的 JSON 响应中添加 ETag header (Lumen)
How add ETag header on JSON response in Laravel (Lumen)
我有两条路线:
$app->get('time1', function(){
return response('time1 = '.time());
});
$app->get('time2', function(){
return response()->json(['time2' => time()]);
});
和一个全局 after-middleware:
public function handle($request, Closure $next)
{
$response = $next($request);
$response->setEtag(md5($response->getContent()));
return $response;
}
在第一种情况下,我有这个 HTTP-header:
ETag:"8114ac3b0aad6e54345ee00f78959316"
但不是在第二个。为什么?第二种情况如何添加相同的header?
您在第二个响应中看不到 ETag 的原因是由于返回的响应是 由服务器压缩 - 参见Content-Encoding:gzip header。这背后的原因是,鉴于 gzip 具有不同的压缩级别 。
,相同的资源不可能 byte-for-byte 相同
您可以禁用 gzip 压缩(检查您的 Apache 配置,尤其是 mod_deflate 模块的配置)或者不使用 ETag.
....
public function handle($request, Closure $next)
{
$response = $next($request);
if ($request->isMethod('GET'))
{
$etag = md5($response->getContent());
$requestETag = str_replace('"', '', $request->getETags());
if ($requestETag && $requestETag[0] == $etag)
{
// Modifies the response so that it conforms to the rules defined for a 304 status code.
$response->setNotModified();
}
$response->setETag($etag);
}
return $response;
}
我有两条路线:
$app->get('time1', function(){
return response('time1 = '.time());
});
$app->get('time2', function(){
return response()->json(['time2' => time()]);
});
和一个全局 after-middleware:
public function handle($request, Closure $next)
{
$response = $next($request);
$response->setEtag(md5($response->getContent()));
return $response;
}
在第一种情况下,我有这个 HTTP-header:
ETag:"8114ac3b0aad6e54345ee00f78959316"
但不是在第二个。为什么?第二种情况如何添加相同的header?
您在第二个响应中看不到 ETag 的原因是由于返回的响应是 由服务器压缩 - 参见Content-Encoding:gzip header。这背后的原因是,鉴于 gzip 具有不同的压缩级别 。
,相同的资源不可能 byte-for-byte 相同您可以禁用 gzip 压缩(检查您的 Apache 配置,尤其是 mod_deflate 模块的配置)或者不使用 ETag.
....
public function handle($request, Closure $next)
{
$response = $next($request);
if ($request->isMethod('GET'))
{
$etag = md5($response->getContent());
$requestETag = str_replace('"', '', $request->getETags());
if ($requestETag && $requestETag[0] == $etag)
{
// Modifies the response so that it conforms to the rules defined for a 304 status code.
$response->setNotModified();
}
$response->setETag($etag);
}
return $response;
}