web-dev-qa-db-ja.com

Laravel response Cache-Controlヘッダーには常に「no-cache」が含まれます

何らかの理由でLaravelは、最後の瞬間に応答ヘッダー「Cache-Control」を操作しているようです。ブラウザのキャッシュを可能にしたいと考えています。

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

「アフターミドルウェア」を使用して死んでレスポンスをダンプしても、私はこれを取得しますが、私には正しいようです。

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
}

メソッド$ response-> isCacheable()alsはtrueを返します。しかし、応答を受け取ると、Firebugは次のように表示します。

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

私はxamppを使用していますが、この同じサーバーでhtmlページ(Laravel/PHP以外)をロードしただけでは、これらのCache-Controlヘッダーは送信されません。

最終変更ヘッダーと期限切れヘッダーを設定したときに、ブラウザーがCache-Controlヘッダー「no-store、no-cache」を受信しないようにするにはどうすればよいですか?

ありがとう!

13
Riesjart

ファントムのキャッシュ制御ヘッダーはPHPからのものだと思います。

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

php.iniでsession.cache_limiterがnocache(デフォルト)に設定されている場合、PHPは次のヘッダーを設定します。

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

私はここ数日、Apacheのlaravelでcache-controlと格闘しています:laravel内にヘッダーを設定すると、 php.iniによって設定されたヘッダー。laravel=を介してアクセスされた.jsおよび.cssファイルのキャッシュを許可するために、Apache.confにいくつかのルールを設定して、リクエストのキャッシュを防止しました.phpファイルに変換されますが、Apacheはlaravelを介して提供されるファイルを(php.index.phpを介してアクセスされるため)認識するため、これらのルールは失敗しました。

最後に、php.iniでsession.cache_limiterを ''に設定し(それにより、PHPによるキャッシュヘッダーの処理をスキップ)、app:after()のfilters.phpに以下を追加することにしました。

     /*
     * 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

正確な構成はわかりませんが、ヘッダー値が上書きされる可能性があるため、Apacheの構成が原因であると思います。

すべてのApache構成ファイルを調べ、Header Set Cache-Controlで始まる行を探します。 Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"

おそらくそのようなディレクティブは、PHP=ファイルのみに影響を与えるように設定されています。これが、他のファイルが他のヘッダーと共に配信される理由です。

ただし、これを変更するときは注意してください。おそらく、これはセキュリティ上の理由から設定する必要があるでしょう。プロキシによる動的な認証済みコンテンツのキャッシングに関する 問題を検討してください(詳細はリンク)

2
Jan D