Предотвращение отправки HTTP-заголовка Cache-control в WordPress

31 окт. 2014 г., 23:50:42
Просмотры: 25.5K
Голосов: 12

Мой сайт размещен на сервере, использующем Varnish в качестве (мощного) механизма кэширования. К сожалению, похоже, что WordPress нарушает кэш Varnish, отправляя HTTP-заголовок cache-control. Когда я выполняю curl -I domain.com, получаю:

HTTP/1.1 200 OK
Server: Apache/2.4.10
X-Powered-By: PHP/5.4.4-14+deb7u14
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=e00738aoughg407ljm270kj0l6; path=/
Content-Type: text/html; charset=UTF-8
Accept-Ranges: bytes
Date: Fri, 31 Oct 2014 21:44:16 GMT
Connection: keep-alive
Via: 1.1 varnish
Age: 0

У меня есть другие сайты WordPress, размещенные на этом сервере, которые корректно работают с сервером Varnish, поэтому я уверен, что проблема вызвана именно этой конкретной установкой. Вот что я попробовал:

  • отключил все плагины. Очистил кэш Varnish, затем выполнил curl -I: результат тот же.
  • просмотрел все файлы темы. Ничего подозрительного не нашел.

Есть ли у вас другие идеи о том, что может вызывать эту проблему?

2
Комментарии

По быстрому поиску я не нашел ни одного случая использования no-store в ядре. Сомневаюсь, что это исходит от самого WP.

Rarst Rarst
1 нояб. 2014 г. 16:28:09

Как отмечает Rarst, no-store не используется, но если это будет полезно для других людей, WP отправляет no-cache, must-revalidate, max-age=0 и несколько других заголовков для вошедших пользователей.

El Yobo El Yobo
12 авг. 2015 г. 02:55:11
Все ответы на вопрос 2
1

Благодаря ответу @chrisguitarguy, вы можете управлять HTTP-заголовками, отправляемыми WordPress, с помощью хука "send_headers". Вот функция, которую я добавил в файл functions.php своей темы, и она решила проблему с сервером Varnish.

function varnish_safe_http_headers() {
    header( 'X-UA-Compatible: IE=edge,chrome=1' );
    session_cache_limiter('');
    header("Cache-Control: public, s-maxage=120");
  if( !session_id() )
  {
    session_start();
  }
}
add_action( 'send_headers', 'varnish_safe_http_headers' );
1 нояб. 2014 г. 20:39:42
Комментарии

это запускает сессию PHP - что означает, что Varnish никогда не будет кэшировать.

matpol matpol
11 мая 2016 г. 12:29:24
3

Вы можете подключиться к хуку wp_headers и удалить заголовки управления кешем. Однако WordPress обычно не отправляет Cache-Control, за исключением запросов в админ-панели или AJAX-запросов.

add_filter('wp_headers', 'wpse167128_nocache');
function wpse167128_nocache($headers)
{
    unset($headers['Cache-Control']);
    return $headers;
}
1 нояб. 2014 г. 00:38:08
Комментарии

Отлично. Вы знаете, будет ли это переопределять любые дальнейшие изменения HTTP-заголовков сторонними плагинами?

pixeline pixeline
1 нояб. 2014 г. 20:20:03

На самом деле, правильный хук - это "send_headers". Опубликую окончательное решение в виде ответа.

pixeline pixeline
1 нояб. 2014 г. 20:36:47

@pixeline wp_headers и send_headers - оба являются валидными хуками...исходный вопрос выглядит как валидный случай использования wp_headers. Смотрите https://developer.wordpress.org/reference/hooks/wp_headers/.

Matt Browne Matt Browne
27 июл. 2020 г. 20:16:05