2015-09-02 16 views
5

Aus irgendeinem Grund scheint Laravel im letzten Moment die Antwort-Header 'Cache-Control' zu manipulieren. Ich möchte Browser-Caching ermöglichen.Laravel-Antwort Cache-Control-Header enthalten immer '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; 
    } 
} 

Selbst wenn ich eine ‚After-Middleware‘ und sterben, und die Antwort Dump, bekomme ich immer noch das, was mir richtig sein scheint.

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 
} 

Die Methode $ response-> isCacheable() gibt true zurück. Aber wenn ich die Antwort erhalten, zeigt Firebug folgendes:

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 

Ich benutze xampp, aber auf dem gleichen Server, wenn ich laden Sie einfach eine HTML-Seite (kein Laravel/PHP), ist es nicht diese cache- schicken Steuerkopfzeilen.

Wie kann ich erreichen, dass der Browser die Cache-Control-Header "no-store, no-cache" nicht erhält, wenn ich die zuletzt geänderten und abgelaufenen Header setze?

Danke!

Antwort

0

Obwohl ich Ihre genaue Konfiguration nicht kenne, würde ich annehmen, dass dies auf Ihre Apache-Konfiguration zurückzuführen ist, da Header-Werte dort überschrieben werden können.

Schauen Sie sich alle Apache-Konfigurationsdateien an und achten Sie auf Zeilen, die mit Header Set Cache-Control beginnen, z. Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"

Wahrscheinlich ist eine solche Anweisung so eingestellt, dass sie nur Ihre PHP-Dateien betrifft, weshalb andere Dateien mit anderen Headern geliefert werden.

Allerdings: Achten Sie darauf, wenn Sie dies ändern. Vielleicht möchten Sie, dass dies aus Sicherheitsgründen eingestellt wird. Betrachten Sie die problems with caching dynamic, authenticated content by proxies (link for detail)

+0

Danke für Ihre Antwort. Da ich versucht habe, den "Laravel-Weg" zu benutzen, habe ich das nicht versucht: header ('Cache-Control: max-age ='. Config ('imagecache.lifetime') * 60). ', Öffentlichkeit'); Jetzt tat ich es und es scheint zu funktionieren. Aber immer noch, wenn ich versuche, es im IlluminateResponse-Objekt zu setzen, habe ich immer noch die gleiche Situation, wie sie im ersten Post oben beschrieben wurde.Denkst du immer noch, dass es vielleicht mit der Apache-Konfiguration zu tun hat? – Riesjart

1

Ich glaube, Ihre Phantom-Cache-Control-Header kommen aus PHP.

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

wenn php.ini session.cache_limiter Satz hat (default) nocache setzt PHP die folgenden Header:

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 

I mit Cache-Control in Laravel kämpfen haben auf Apache für ein paar Tage jetzt: Ich fand, dass das Setzen der Header innerhalb Laravel einfach angehängt sie an die Header von php.ini gesetzt. Ich habe versucht, einige Regeln in apache.conf einzurichten, um Caching von .js- und .css-Dateien zu erlauben, auf die über Laravel zugegriffen wurde, während das Zwischenspeichern von Anfragen in .php-Dateien verhindert wurde, aber diese Regeln fehlten, da Apache jede Datei sehen wird über Laravel als .php-Datei (weil auf sie über index.php zugegriffen wird).

Am Ende I zur Einstellung session.cache_limiter auf '' in php.ini nieder, und das Hinzufügen der folgenden filters.php in app (wodurch PHPs Handhabung von Cache-Header-Skipping): Nach()

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