Evitar que Wordpress envíe el encabezado HTTP Cache-control

31 oct 2014, 23:50:42
Vistas: 25.5K
Votos: 12

Mi sitio está alojado en un servidor que utiliza Varnish como motor de caché (potente). Desafortunadamente, parece que WordPress está invalidando la caché de Varnish al enviar un encabezado HTTP cache-control. Si ejecuto curl -I dominio.com obtengo:

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

Tengo otros sitios WordPress alojados en este servidor que funcionan correctamente con el servidor Varnish, así que estoy bastante seguro de que el problema es causado por esta instalación específica. Esto es lo que he intentado:

  • desactivar todos los plugins. Vaciar la caché de Varnish, luego curl -I: mismo resultado.
  • revisar todos los archivos de mi tema. Nada sospechoso.

¿Tienen alguna otra idea de qué puede estar causando el problema?

2
Comentarios

En una búsqueda rápida no encuentro ni un solo caso de no-store siendo usado en el núcleo. Dudo que esto provenga de WP mismo.

Rarst Rarst
1 nov 2014 16:28:09

Como menciona Rarst, no-store no se usa, pero si es útil para otras personas, WP enviará no-cache, must-revalidate, max-age=0 y algunos otros para usuarios logueados.

El Yobo El Yobo
12 ago 2015 02:55:11
Todas las respuestas a la pregunta 2
1

Gracias a la respuesta de @chrisguitarguy, puedes controlar los encabezados HTTP enviados por WordPress mediante el hook "send_headers". Aquí está la función que agregué al archivo functions.php de mi tema y que resolvió el problema con el servidor 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 nov 2014 20:39:42
Comentarios

esto inicia una sesión PHP - lo que significa que Varnish nunca almacenará en caché.

matpol matpol
11 may 2016 12:29:24
3

Puedes engancharte a wp_headers y eliminar las cabeceras de control de caché. Sin embargo, WordPress generalmente no envía Cache-Control excepto para el área de administración o solicitudes AJAX.

add_filter('wp_headers', 'wpse167128_nocache');
function wpse167128_nocache($headers)
{
    unset($headers['Cache-Control']);
    return $headers;
}
1 nov 2014 00:38:08
Comentarios

Bien. ¿Sabes si esto anulará cualquier reescritura posterior de encabezados HTTP por parte de plugins de terceros?

pixeline pixeline
1 nov 2014 20:20:03

De hecho, el hook correcto es "send_headers". Publicaré la solución final como una respuesta.

pixeline pixeline
1 nov 2014 20:36:47

@pixeline tanto wp_headers como send_headers son hooks válidos... la pregunta original parece un caso de uso válido para wp_headers. Ver https://developer.wordpress.org/reference/hooks/wp_headers/.

Matt Browne Matt Browne
27 jul 2020 20:16:05