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


Что-то, я думаю, Apache, добавляет эти HTTP-заголовки ко всем ответам, генерируемым PHP-скриптами:

Expires:   Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control:  no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Это нормально работает для реальных динамических страниц, но у меня есть некоторые страницы, которые, хотя и генерируются PHP, в основном статичны, и я хочу, чтобы браузер кэшировал их.

Есть ли в PHP способ удалить эти заголовки из ответа и, таким образом, активировать правила кэширования браузера по умолчанию, или, если нет, есть ли какое-либо значение, которое я могу установить для них, эквивалентное тому, что они отсутствует?

Я бы предпочел не устанавливать свои собственные значения, потому что я хочу, чтобы браузер использовал те же правила кэширования, что и для статических ресурсов, которые обслуживаются самим Apache (без использования mod_cache).

Author: Bart van Heukelom, 2009-12-21

9 answers

Сначала я бы проверил, действительно ли это не один из 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>';
}

Печатает ли это что-то "полезное" на вашем сервере?

 2
Author: VolkerK, 2009-12-21 08:11:10

Для этих конкретных файлов вы можете добавить вызовы header(), которые устанавливают эти заголовки по-разному. т. е.. header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate")
 7
Author: Myles, 2009-12-21 00:17:12

Вы можете вручную предоставить HTTP-заголовки из PHP через header() функция.

Я бы предположил, что это должно привести к отключению значений заголовка веб-сервера по умолчанию.

 2
Author: Ben Karel, 2009-12-21 00:16:58
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT");

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

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

 1
Author: WarrenB, 2009-12-21 00:17:24

Эти заголовки кэша отправляются, когда вы начинаете использовать сеансы и по умолчанию устанавливаете значение "nocache"; это гарантирует, что каждый запрос дает согласованные результаты.

Например, если у вас есть система корзины и ваш браузер кэширует /add?product=xyz, он может не добавить товар снова; это, вероятно, не то, что вы хотите.

Сказав это, настройку по умолчанию можно изменить либо с помощью session_cache_limiter() до того, как session_start() или установка соответствующего session.cache_limiter конфигурация установка.

 1
Author: Ja͢ck, 2013-02-15 11:00:45

Вероятно, где-то в вашем коде установлены эти переменные, так как я нигде не могу найти, где они автоматически вставляются PHP, и их нет ни в одной из моих установок LAMP.

Единственный автоматически сгенерированный заголовок для моих установок - X-Powered-By с версией PHP.

Как вы сказали, из документов они рекомендуют сказать header("Expires:");, чтобы заменить старый заголовок, но header("Cache-control:"); только что стал Cache-Control: max-age=0 в моем браузере (так что это не то, что вы пытаетесь сделать).

Я бы рекомендуем проверить, взяты ли эти значения из фреймворка или настроек, которые вы изменили, но они могут отличаться в разных версиях PHP/платформах, на которых вы используете PHP.

Я бы проверил наличие директив ExpiresByType или ExpiresDefault в глобальных конфигурациях, vhosts, файлах pr.htaccess или любых блоках, инкапсулированных в <IfModule mod_expires> или <IfModule mod_expires.c>

"Я хочу, чтобы браузер использовал те же правила кэширования, что и для статических ресурсов, которые обслуживаются самим Apache (без использования mod_cache)".

Попробуйте взглянуть на статический ресурс, а затем соответствие правилам. Вы можете рассчитать время истечения срока действия с помощью этого -> http://www.php.net/manual/en/function .заголовок.php#93377

 0
Author: Dan Beam, 2009-12-21 02:26:15

Подавить содержимое кэша можно следующим образом: PHP-код:

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() - Руководство они

 0
Author: streetparade, 2011-11-13 18:11:32

Если ваши страницы меняются не так часто, вам следует рассмотреть возможность использования заголовков Etag, например:

Https://gist.github.com/oliworx/4951478

Это особенно полезно при медленных соединениях (например, мобильных телефонах).

Подсказка: Вы всегда должны проверять, что на самом деле загружает браузер, с помощью дополнения firefox "Живые заголовки HTTP": https://addons.mozilla.org/de/firefox/addon/live-http-headers/

 0
Author: Oliver Kurmis, 2013-02-15 10:49:58

Я не пробовал этого, но вы, вероятно, могли бы сохранить такие страницы, как файлы .html с вашими пользовательскими заголовками или отсутствием их, и скрипт мог бы работать внутри

 -1
Author: anijhaw, 2009-12-21 01:48:18