PHP удаляет HTTP-заголовок

Что-то, я думаю, 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"); 

или какое-то нелепое время в далеком будущем. Не забудьте установить значения заголовка перед отправкой любого вывода, если только вы не выполняете буферизацию вывода для всей страницы.

http://php.net/manual/en/function.header.php

Эти кеш-заголовки отправляются при запуске сеансов и по умолчанию устанавливаются в «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-файлы, с вашими пользовательскими заголовками или отсутствием их имени, и скрипт мог работать внутри