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).
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>';
}
Печатает ли это что-то "полезное" на вашем сервере?
Для этих конкретных файлов вы можете добавить вызовы 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
в глобальных конфигурациях, vhosts, файлах pr.htaccess или любых блоках, инкапсулированных в <IfModule mod_expires>
или <IfModule mod_expires.c>
"Я хочу, чтобы браузер использовал те же правила кэширования, что и для статических ресурсов, которые обслуживаются самим Apache (без использования mod_cache)".
Попробуйте взглянуть на статический ресурс, а затем соответствие правилам. Вы можете рассчитать время истечения срока действия с помощью этого -> http://www.php.net/manual/en/function .заголовок.php#93377
Подавить содержимое кэша можно следующим образом: 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()
- Руководство они
Если ваши страницы меняются не так часто, вам следует рассмотреть возможность использования заголовков Etag, например:
Https://gist.github.com/oliworx/4951478
Это особенно полезно при медленных соединениях (например, мобильных телефонах).
Подсказка: Вы всегда должны проверять, что на самом деле загружает браузер, с помощью дополнения firefox "Живые заголовки HTTP": https://addons.mozilla.org/de/firefox/addon/live-http-headers/
Я не пробовал этого, но вы, вероятно, могли бы сохранить такие страницы, как файлы .html с вашими пользовательскими заголовками или отсутствием их, и скрипт мог бы работать внутри