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!
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");
}
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)