Prevenirea trimiterii header-ului Cache-control HTTP de către WordPress

31 oct. 2014, 23:50:42
Vizualizări: 25.5K
Voturi: 12

Site-ul meu rulează pe un server care folosește Varnish ca motor de caching (puternic). Din păcate, se pare că WordPress invalidează cache-ul Varnish prin trimiterea unui header HTTP cache-control. Dacă rulez curl -I domain.com primesc:

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

Am alte site-uri WordPress găzduite pe acest server, care funcționează corect cu serverul Varnish, așa că sunt destul de sigur că problema este cauzată de această instalare specifică. Iată ce am încercat:

  • dezactivarea tuturor plugin-urilor. Golirea cache-ului Varnish, apoi curl -I: același rezultat.
  • verificarea tuturor fișierelor temei. Nimic suspect.

Aveți alte idei despre ce ar putea cauza problema?

2
Comentarii

După o căutare rapidă, nu am găsit nicio instanță în care no-store să fie folosit în nucleul WordPress. Mă îndoiesc că aceasta provine de la WP în sine.

Rarst Rarst
1 nov. 2014 16:28:09

După cum notează Rarst, no-store nu este folosit, dar dacă este util pentru alți utilizatori, WP va trimite no-cache, must-revalidate, max-age=0 și câteva altele pentru utilizatorii autentificați.

El Yobo El Yobo
12 aug. 2015 02:55:11
Toate răspunsurile la întrebare 2
1

Mulțumită răspunsului lui @chrisguitarguy, poți controla headerele HTTP trimise de WordPress prin hook-ul "send_headers". Iată funcția pe care am adăugat-o în fișierul functions.php al temei mele și care a rezolvat problema cu serverul 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
Comentarii

acest lucru inițiază o sesiune php - ceea ce înseamnă că varnish nu va stoca în cache niciodată.

matpol matpol
11 mai 2016 12:29:24
3

Poți folosi hook-ul wp_headers pentru a elimina headerele de control al cache-ului. WordPress nu trimite de obicei Cache-Control, exceptând zonele de administrare sau cererile AJAX.

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

Bun. Știi dacă va suprascrie orice altă rescriere a header-ului http de către plugin-uri terțe?

pixeline pixeline
1 nov. 2014 20:20:03

De fapt, hook-ul corect este "send_headers". Voi posta soluția finală ca răspuns.

pixeline pixeline
1 nov. 2014 20:36:47

@pixeline wp_headers și send_headers sunt ambele hook-uri valide...întrebarea originală pare a fi un caz de utilizare valid pentru wp_headers. Vezi https://developer.wordpress.org/reference/hooks/wp_headers/.

Matt Browne Matt Browne
27 iul. 2020 20:16:05