Impedire a WordPress di inviare l'header HTTP Cache-control
Il mio sito si trova su un server che utilizza Varnish come motore di caching (potente).
Sfortunatamente, sembra che WordPress stia invalidando la cache di Varnish inviando un header http cache-control. Se eseguo curl -I domain.com
ottengo:
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
Ho altri siti WordPress ospitati su questo server che funzionano correttamente con il server Varnish, quindi sono abbastanza sicuro che il problema sia causato da questa specifica installazione. Ecco cosa ho provato:
- disabilitare tutti i plugin. Svuotare la cache di Varnish, quindi eseguire
curl -I
: stesso risultato. - esaminato tutti i file del tema. Nulla di sospetto.
Avete altre idee su cosa potrebbe causare il problema?
Grazie alla risposta di @chrisguitarguy, puoi controllare gli header HTTP inviati da WordPress tramite l'hook "send_headers". Ecco la funzione che ho aggiunto al file functions.php del mio tema e che ha risolto il problema con il server 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' );

Puoi agganciarti a wp_headers
per rimuovere gli header di controllo cache. WordPress generalmente non invia Cache-Control
tranne che per l'area amministrativa o le richieste AJAX.
add_filter('wp_headers', 'wpse167128_nocache');
function wpse167128_nocache($headers)
{
unset($headers['Cache-Control']);
return $headers;
}

Bene. Sai se sovrascriverà eventuali ulteriori riscritture degli header HTTP da parte di plugin di terze parti?

In effetti, l'hook corretto è "send_headers". Pubblicherò la soluzione definitiva come risposta.

@pixeline wp_headers e send_headers sono entrambi hook validi...la domanda originale sembra un caso d'uso valido per wp_headers. Vedi https://developer.wordpress.org/reference/hooks/wp_headers/.
