web-dev-qa-db-fra.com

Laravel réponse en-têtes Cache-Control contenant toujours 'no-cache'

Pour une raison quelconque Laravel semble manipuler les en-têtes de réponse "Cache-Control" au tout dernier moment. Je veux rendre la mise en cache du navigateur possible.

class TestController extends Controller
{

    public function getTest()
    {
        $response = new \Illuminate\Http\Response('test', 200, array(
            'Cache-Control' => 'max-age='.(config('imagecache.lifetime')*60).', public',
            'Content-Length' => strlen('test'),
        ));

        $response->setLastModified(new \DateTime('now'));
        $response->setExpires(\Carbon\Carbon::now()->addMinutes(config('imagecache.lifetime')));

        return $response;
     }
}

Même lorsque j'utilise un "after-middleware" et que je meurs et vide la réponse, j'obtiens toujours ceci, ce qui me semble juste.

Response {#625 ▼
  +original: "test"
  +exception: null
  +headers: ResponseHeaderBag {#626 ▼
    #computedCacheControl: array:2 [▼
      "max-age" => "2592000"
      "public" => true
    ]
    #cookies: []
    #headerNames: array:5 [▶]
    #headers: array:5 [▼
      "cache-control" => array:1 [▼
        0 => "max-age=2592000, public"
      ]
      "content-length" => array:1 [▼
        0 => 4
      ]
      "date" => array:1 [▶]
      "last-modified" => array:1 [▼
        0 => "Sun, 16 Aug 2015 15:42:08 GMT"
      ]
      "expires" => array:1 [▶]
    ]
    #cacheControl: array:2 [▼
      "max-age" => "2592000"
      "public" => true
    ]
  }
  #content: "test"
  #version: "1.0"
  #statusCode: 200
  #statusText: "OK"
  #charset: null
}

La méthode $ response-> isCacheable () als renvoie true. Mais lorsque je reçois la réponse, Firebug affiche ce qui suit:

Cache-Control   
no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection  
Keep-Alive
Content-Type    
text/html
Date    
Sun, 16 Aug 2015 15:42:08 GMT
Expires 
Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive  
timeout=5, max=98
Pragma  
no-cache
Server  
Apache/2.4.10 (Win32) OpenSSL/1.0.1i PHP/5.5.15
Transfer-Encoding   
chunked
X-Powered-By    
PHP/5.5.15

J'utilise xampp, mais sur ce même serveur lorsque je charge juste une page html (pas de Laravel/PHP), il n'envoie pas ces en-têtes Cache-Control.

Comment puis-je m'assurer que le navigateur ne reçoit pas les en-têtes Cache-Control "no-store, no-cache" lorsque j'ai défini les derniers en-têtes modifiés et expirés?

Merci!

13
Riesjart

Je crois que vos en-têtes de contrôle de cache fantôme proviennent de PHP.

http://php.net/manual/en/function.session-cache-limiter.php

lorsque php.ini a session.cache_limiter défini sur nocache (par défaut), PHP définit les en-têtes suivants:

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store,no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache

Je lutte depuis quelques jours avec le contrôle du cache dans laravel sur Apache: j'ai constaté que la définition des en-têtes dans laravel les ajoutait simplement à la en-têtes définis par php.ini. J'ai essayé de configurer certaines règles dans Apache.conf afin de permettre la mise en cache des fichiers .js et .css qui étaient accessibles via laravel tout en empêchant la mise en cache des demandes aux fichiers .php, mais ces règles ont échoué car Apache verra tout fichier servi via laravel en tant que fichier .php (car il est accessible via index.php).

À la fin, je me suis contenté de définir session.cache_limiter sur '' dans php.ini (sautant ainsi la gestion des PHP des en-têtes de cache) et en ajoutant ce qui suit à filters.php dans l'application: after ()

     /*
     * Custom cache headers for js and css files
     */
    if ($request->is('*.js') || $request->is('*.css')){
        $response->header("pragma", "private");
        $response->header("Cache-Control", " private, max-age=86400");
    } else {
        $response->header("pragma", "no-cache");
        $response->header("Cache-Control", "no-store,no-cache, must-revalidate, post-check=0, pre-check=0");
    }
7
Geoff Salmon

Bien que je ne connaisse pas votre configuration exacte, je suppose que cela est dû à votre configuration Apache, car les valeurs d'en-tête peuvent y être écrasées.

Jetez un œil à tous les fichiers de configuration Apache et recherchez les lignes commençant par Header Set Cache-Control, par exemple. Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"

Une telle directive est probablement définie pour n'affecter que vos fichiers PHP, ce qui serait la raison pour laquelle d'autres fichiers sont livrés avec d'autres en-têtes.

Cependant: faites attention lorsque vous changez cela. Vous souhaiterez peut-être que cela soit défini pour des raisons de sécurité. Tenez compte des problèmes de mise en cache du contenu dynamique et authentifié par des mandataires (lien pour plus de détails)

2
Jan D