Что-то, я думаю, Apache добавляет эти HTTP-заголовки ко всем ответам, генерируемым PHP-скриптами:
Истекает: Чт, 19 ноября 1981 г. 08:52:00 GMT Cache-Control: no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0
Это работает нормально для реальных динамических страниц, но у меня есть страница, которая, будучи сгенерирована PHP, в основном статична, и я хочу, чтобы браузер их кешировал.
Есть ли способ в PHP удалить эти заголовки из ответа и, таким образом, активировать правила кэширования по умолчанию браузера, или, если нет, есть ли какое-либо значение, которое я могу установить для них, эквивалентное отсутствию?
Я бы предпочел не устанавливать свои собственные значения, потому что я хочу, чтобы браузер использовал те же правила кэширования, что и для статических ресурсов, которые обслуживаются самим Apache (без использования mod_cache).
Сначала я бы проверял, действительно ли это не один из php-скриптов, который устанавливает эти заголовки.
register_shutdown_function('foo'); echo "test"; function foo() { flush(); $c = "headers_list: \n " . join("\n ", headers_list()); if ( function_exists('apache_response_headers') ) { $c .= "\napache_response_headers:"; foreach( apache_response_headers() as $k=>$v) { $c.= "\n $k=$v"; } } $c .= "\n\n"; echo '<pre>', $c, '</pre>'; }
Печатает ли что-нибудь «полезное» на вашем сервере?
Для этих конкретных файлов вы можете добавлять вызовы header (), которые устанавливают эти заголовки по-разному. то есть. header("Expires: " . $currentDatePlus10);
header("Cache-Control: max-age=3600, must-revalidate")
Вы можете вручную предоставить HTTP-заголовки из PHP через функцию header()
.
Я бы предположил, что это должно привести к отключению значений заголовка веб-сервера по умолчанию.
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT");
или какое-то нелепое время в далеком будущем. Не забудьте установить значения заголовка перед отправкой любого вывода, если только вы не выполняете буферизацию вывода для всей страницы.
Эти кеш-заголовки отправляются при запуске сеансов и по умолчанию устанавливаются в «nocache»; это гарантирует, что каждый запрос дает согласованные результаты.
Например, если у вас есть система корзины, а ваш браузер кэширует /add?product=xyz
, он не может снова добавить продукт; это, вероятно, не то, что вы хотите.
Сказав это, значение по умолчанию может быть изменено либо с помощью session_cache_limiter()
до session_start()
либо с установкой соответствующего параметра конфигурации session.cache_limiter
.
Вероятно, где-то в вашем коде, который установил эти переменные, поскольку я не могу найти, где они автоматически добавляются PHP, и ни в одной из моих установок LAMP.
Единственный автоматически созданный заголовок для моих установок – X-Powered-By
с версией PHP.
Как вы уже сказали, из документов рекомендуется указывать header("Expires:");
заменить старый заголовок, но header("Cache-control:");
просто стал Cache-Control: max-age=0
в моем браузере (так что это не то, что вы пытаетесь сделать).
Я бы рекомендовал проверить, исходят ли эти значения из фреймворка или настроек, которые вы изменили, но они могут быть разными в разных версиях PHP / платформ, на которых вы будете запускать PHP.
Я бы проверял директивы ExpiresByType
или ExpiresDefault
в глобальных ExpiresByType
ExpiresDefault
ExpiresByType
ExpiresDefault
или любых блоках, инкапсулированных в <IfModule mod_expires>
или <IfModule mod_expires.c>
«Я хочу, чтобы браузер использовал те же правила кэширования, что и для статических ресурсов, обслуживаемых самим Apache (без использования mod_cache)».
Попробуйте взглянуть на статический ресурс, а затем сопоставить правила. Вы можете рассчитать Expires offest с этим -> http://www.php.net/manual/en/function.header.php#93377
подавление кэша можно сделать следующим образом: PHP Code:
header ( "Cache-Control: no-cache, must-revalidate"); / / HTTP/1.1 header ( "Expires: Mon, 1 Jul 1990 05:00:00 GMT"); / / Date in the past
если вы хотите автоматически сгенерировать его, то вы это здесь: PHP: session_cache_limiter()
– Направьте их
Если ваши страницы не часто меняются, вам следует подумать об использовании заголовков Etag, например:
https://gist.github.com/oliworx/4951478
Это особенно полезно при медленных соединениях (например, мобильных телефонах).
Подсказка: вы всегда должны проверять, что браузер действительно загружает, с аддоном firefox «Live HTTP headers»: https://addons.mozilla.org/de/firefox/addon/live-http-headers/
Я не пробовал это, но вы, вероятно, могли бы сохранить такие страницы, как .html-файлы, с вашими пользовательскими заголовками или отсутствием их имени, и скрипт мог работать внутри