12/08/2018, 16:37

Laravel 5.x middleware manage ''Cache-Control:no-cache'' phòng ngừa browser back button

Trong bài viết này mình giới thiệu về cách quản lý cache-control khi bạn ấn nút back trên browser trong laravel 5.x Nếu bạn không phòng chống cache-control thì có thể xảy ra nhiều lỗi Khi logout ra rồi ấn nút back thì vẫn hiển thị ra màn hình khi chưa logout Javascript bị cache, ấn nút back ...

Trong bài viết này mình giới thiệu về cách quản lý cache-control khi bạn ấn nút back trên browser trong laravel 5.x Nếu bạn không phòng chống cache-control thì có thể xảy ra nhiều lỗi

  • Khi logout ra rồi ấn nút back thì vẫn hiển thị ra màn hình khi chưa logout
  • Javascript bị cache, ấn nút back lại có thể bị lỗi vv...

Thực ra bản chất của vấn đề chỉ là cache browser, bạn có thể thiết lập quản lý cache vào trong html, hoặc php để handler điều khiển cache Trong laravel 5x, mình sẽ giới thiệu cách sử dụng middleware để hanlder Cache-Control

Create new middleware

php artisan make:middleware AllowCache

Code in middleware

<?php

namespace AppHttpMiddleware;

use Closure;

/**
 * Modify request header
 *
 * @ copyright Copyright (c) 2017 ngo.dinh.ngoc
 */
class AllowCache
{
    /**
     * Handle an incoming request.
     *
     * @param  Request $request
     * @param  Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        if (!$response->isRedirect()) {
           // TODO https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
            $response->header('Cache-Control: no-cache, no-store, must-revalidate', true);
        }

        return $response;
    }
}

Register middleware

Đăng ký theo path sau /app/Http/Kernel.php

protected $middleware = [
        IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
        IlluminateFoundationHttpMiddlewareValidatePostSize::class,
        AppHttpMiddlewareTrimStrings::class,
        IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
        AppHttpMiddlewareTrustProxies::class,
        AppHttpMiddlewareAllowCache::class,
    ];

Summary

Trên là cách handle cache-control trong laravel trong dự án, tuy nhiên với những response mà trả về kiểu BinaryFileResponse bạn nên để cache cho nó!

Bạn có thể xem code mẫu ở đây https://github.com/ngodinhngoc/laravel_tip/commit/76cfb9231e9802f9a37f213ad05cdc35155488f8

0