2015-09-02 23 views
5

Per qualche motivo, Laravel sembra manipolare le intestazioni di risposta 'Cache-Control' all'ultimo momento. Voglio rendere possibile il caching del browser.Laravel response Intestazioni Cache-Control che contengono sempre 'no-cache'

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; 
    } 
} 

Anche quando uso un 'dopo-middleware' e morire e scaricare la risposta, ho ancora ottenere questo, quello che sembra essere giusto per me.

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 
} 

Il metodo $ response-> isCacheable() restituisce true. Ma quando ricevo la risposta, Firebug mostra la seguente:

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 

Io uso XAMPP, ma su questo stesso server quando ho appena caricare una pagina HTML (senza laravel/PHP), non invia questi Cache Controlla le intestazioni.

Come posso ottenere che il browser non riceva le intestazioni di Cache-Control "no-store, no-cache" quando imposto le intestazioni dell'ultimo modificato e scade?

Grazie!

risposta

0

Anche se non conosco la configurazione esatta, suppongo che ciò sia dovuto alla configurazione di Apache, in quanto i valori dell'intestazione possono essere sovrascritti lì.

Dai un'occhiata a tutti i file di configurazione di Apache e cerca le linee che iniziano con Header Set Cache-Control, ad es. Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"

Probabilmente tale direttiva è impostata per influenzare solo i file PHP, il che sarebbe il motivo per cui altri file vengono consegnati con altre intestazioni.

Tuttavia: attenzione quando si cambia questo. Forse vorresti che fosse impostato per motivi di sicurezza. Considerare lo problems with caching dynamic, authenticated content by proxies (link for detail)

+0

Grazie per la risposta. Mentre stavo cercando di usare il "modo Laravel", non ho provato questo: header ('Cache-Control: max-age ='. Config ('imagecache.lifetime') * 60). ', pubblico'); Ora l'ho fatto e sembra funzionare. Tuttavia, quando cerco di impostarlo nell'oggetto IlluminateResponse, ho ancora la stessa situazione descritta nel post iniziale sopra.Pensi ancora che possa avere a che fare con la configurazione di Apache? – Riesjart

1

Credo che le intestazioni di controllo della cache fantasma provengano da PHP.

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

quando php.ini ha session.cache_limiter insieme a nocache (default), PHP imposta le seguenti intestazioni:

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 

ho lottato con Cache-Control in laravel su apache per alcuni giorni: ho scoperto che l'impostazione delle intestazioni all'interno di laravel le aggiungeva semplicemente alle intestazioni impostate da php.ini. Ho provato a impostare alcune regole in apache.conf per consentire il caching dei file .js e .css a cui si stava accedendo tramite laravel impedendo al contempo la memorizzazione nella cache delle richieste ai file .php, ma queste regole non sono riuscite poiché Apache vedrebbe qualsiasi file essere servito via laravel come file .php (perché è accessibile tramite index.php).

Alla fine ho optato per l'impostazione session.cache_limiter a '' nel php.ini (saltando così phps gestione delle intestazioni di cache), e aggiungendo quanto segue al filters.php in app: dopo()

 /* 
    * 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"); 
    } 
Problemi correlati