如何在Laravel(Lumen)中的JSON响应中添加ETag标头

时间:2015-12-12 10:44:13

标签: php laravel etag lumen

我有两条路线:

$app->get('time1', function(){
    return response('time1 = '.time());
});
$app->get('time2', function(){
    return response()->json(['time2' => time()]);
});

一个全球性的中间件:

public function handle($request, Closure $next)
{
    $response = $next($request);
    $response->setEtag(md5($response->getContent()));
    return $response;
}

在第一种情况下,我有这个HTTP标题:

ETag:"8114ac3b0aad6e54345ee00f78959316"

但不是在第二个。为什么?如何在第二种情况下添加相同的标题?

2 个答案:

答案 0 :(得分:3)

您在第二个响应中看不到 ETag 的原因是您的网络服务器剥离了此标头,因为服务器返回的响应是压缩 - 请参阅 Content-Encoding:gzip 标头。这背后的原因是,相同的资源不能逐字节相同,因为 gzip具有各种压缩级别

您可以禁用 gzip压缩(检查您的Apache配置,尤其是mod_deflate模块的配置),也可以不使用 ETag

答案 1 :(得分:0)

 ....    

  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;

}