Impedire a WordPress di inviare l'header HTTP Cache-control

31 ott 2014, 23:50:42
Visualizzazioni: 25.5K
Voti: 12

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?

2
Commenti

Dalla ricerca rapida non trovo un singolo caso in cui no-store venga utilizzato nel core. Dubito che provenga da WP stesso.

Rarst Rarst
1 nov 2014 16:28:09

Come nota Rarst, no-store non è utilizzato, ma se può essere utile per altre persone, WP invierà no-cache, must-revalidate, max-age=0 e alcuni altri per gli utenti loggati.

El Yobo El Yobo
12 ago 2015 02:55:11
Tutte le risposte alla domanda 2
1

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' );
1 nov 2014 20:39:42
Commenti

questo avvia una sessione PHP - il che significa che Varnish non memorizzerà mai nella cache.

matpol matpol
11 mag 2016 12:29:24
3

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;
}
1 nov 2014 00:38:08
Commenti

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

pixeline pixeline
1 nov 2014 20:20:03

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

pixeline pixeline
1 nov 2014 20:36:47

@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/.

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