По какой-то причине 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
Я боролся с управлением кэшем в laravel на apache уже несколько дней: я обнаружил, что установка заголовков внутри laravel просто добавляет их к заголовкам, установленным php.ini. Я попытался настроить некоторые правила в apache.conf, чтобы разрешить кэширование файлов .js и .css, к которым обращались через laravel, при этом предотвращая кэширование запросов к файлам .php, но эти правила не сработали, так как apache увидит, что любой файл служил через laravel как файл .php (потому что к нему обращаются через index.php).
В конце я остановился на установке для session.cache_limiter значения » ‘в php.ini (тем самым пропустил обработку PHP заголовков кэша) и добавил следующее в filters.php в приложении: 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");
}
Хотя я не знаю вашей точной конфигурации, я бы предположил, что это связано с вашей конфигурацией Apache, поскольку значения заголовков могут быть там перезаписаны.
Просмотрите все файлы конфигурации Apache и найдите строки, начинающиеся с Header Set Cache-Control
например, Header Set Cache-Control "no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
Вероятно, такая директива настроена так, чтобы воздействовать только на ваши PHP-файлы, что может быть причиной того, что другие файлы доставляются с другими заголовками.
Однако: будьте внимательны при изменении этого. Может быть, вы хотите, чтобы это было установлено по соображениям безопасности. Рассмотрим проблемы с кэшированием динамического, аутентифицированного контента через прокси (ссылка для подробностей)