ETag Middleware
在我們的網站若資料未變更,我們會希望告訴請求資源的使用者,本資源未修改(304 Not Modified),所以不用重複讀取資料,這樣可以節省我們傳輸資料頻寬
我可以用 Middleware 來達到 ETag 的效果
建立 ETag Middleware
App\Http\Middleware\ETagMiddleware.php
<?php
namespace App\Http\Middleware;
use Closure;
class ETagMiddleware {
/**
* Implement Etag support
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
// Get response
$response = $next($request);
// 如果是 get request
if ($request->isMethod('get')) {
// 產生回應內容的 etag
$etag = md5($response->getContent());
$requestEtag = str_replace('"', '', $request->getETags());
// 檢查 etag 是否變更
if($requestEtag AND ($requestEtag[0] == $etag OR $requestEtag[0] == 'W/'.$etag)) {
// 若 etag 相同,設定表頭為資料未修改
$response->setNotModified();
}
// 設定 etag
$response->setEtag($etag);
}
// 傳送回應
return $response;
}
}
設定 Etag Middleware
app/Http/Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\ETagMiddleware::class,
],
];
這樣我們就完成 Etag Middleware 的設定了!