何らかの理由で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」を受信しないようにするにはどうすればよいですか?
ありがとう!
ファントムのキャッシュ制御ヘッダーは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");
}
正確な構成はわかりませんが、ヘッダー値が上書きされる可能性があるため、Apacheの構成が原因であると思います。
すべてのApache構成ファイルを調べ、Header Set Cache-Control
で始まる行を探します。 Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
おそらくそのようなディレクティブは、PHP=ファイルのみに影響を与えるように設定されています。これが、他のファイルが他のヘッダーと共に配信される理由です。
ただし、これを変更するときは注意してください。おそらく、これはセキュリティ上の理由から設定する必要があるでしょう。プロキシによる動的な認証済みコンテンツのキャッシングに関する 問題を検討してください(詳細はリンク)