PHP удалить заголовок HTTP - PullRequest
9 голосов
/ 21 декабря 2009

Я думаю, что 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).

Ответы [ 9 ]

7 голосов
/ 21 декабря 2009

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

header("Cache-Control: max-age=3600, must-revalidate")
2 голосов
/ 21 декабря 2009

Сначала я бы проверил, действительно ли это не один из php-скриптов, который устанавливает эти заголовки.

<code>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, '
'; }

Распечатывает ли это что-то "пригодное для использования" на вашем сервере?

2 голосов
/ 21 декабря 2009

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

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

1 голос
/ 15 февраля 2013

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

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

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

1 голос
/ 21 декабря 2009
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT");

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

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

0 голосов
/ 15 февраля 2013

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

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

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

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

0 голосов
/ 21 декабря 2009

Скорее всего, где-то в вашем коде установлены эти переменные, поскольку я не могу найти, где они вставляются автоматически 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).»

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

0 голосов
/ 21 декабря 2009

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

0 голосов
/ 21 декабря 2009

подавить то, что из кеша можно сделать следующим образом: Код 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() - вручную они

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...