Ah ah ! J’ai enfin réussi à régler le problème du chunked avec Google Chrome ! Il était bien du à la façon dont varnish gère le chunk… Etrange.
Donc en ajoutant ceci :
sub vcl_recv {
….
# — WordPress specific configuration
# Did not cache the admin and login pages
if (req.url ~ « wp-(login|admin) » || req.url ~ « preview=true ») {
return (pass);
}#dont cache ajax requests
if(req.http.X-Requested-With == « XMLHttpRequest » || req.url ~ « nocache » || req.url ~ « (admin-ajax.php|control.php|wp-comments-post.php|wp-login.php|bb-login.php|bb-reset-password.php|register.php) »)
{
return (pass);
}# Normalize Accept-Encoding header and compression
# https://www.varnish-cache.org/docs/3.0/tutorial/vary.html
if (req.http.Accept-Encoding) {
# Do no compress compressed files…
if (req.url ~ « \.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$ ») {
unset req.http.Accept-Encoding;
} elsif (req.http.Accept-Encoding ~ « gzip ») {
set req.http.Accept-Encoding = « gzip »;
} elsif (req.http.Accept-Encoding ~ « deflate ») {
set req.http.Accept-Encoding = « deflate »;
} else {
unset req.http.Accept-Encoding;
}
}
….
}
dans notre fichier default.vcl (nano /etc/varnish/default.vcl), on arrive enfin à passer outre le bug de chrome « ERR_INCOMPLETE_CHUNKED_ENCODING » ! Chrome est vraiment trop stricte à ce niveau… En gros, il faut normaliser les entêtes Accept-Encoding et éviter de cacher ces requêtes. Et là… Magie, ça marche !
J’en ai profité pour faire d’autres optimisations… Sur les Cookies cette fois-ci !
sub vcl_recv {
….
# Remove the Quant Capital cookies (added by some plugin, all __qca)
set req.http.Cookie = regsuball(req.http.Cookie, « __qc.=[^;]+(; )? », « »);# Remove the wp-settings-1 cookie
set req.http.Cookie = regsuball(req.http.Cookie, « wp-settings-1=[^;]+(; )? », « »);# Remove the wp-settings-time-1 cookie
set req.http.Cookie = regsuball(req.http.Cookie, « wp-settings-time-1=[^;]+(; )? », « »);# Remove the wp test cookie
set req.http.Cookie = regsuball(req.http.Cookie, « wordpress_test_cookie=[^;]+(; )? », « »);# Are there cookies left with only spaces or that are empty?
if (req.http.cookie ~ « ^ *$ ») {
unset req.http.cookie;
}# Check the cookies for wordpress-specific items
if (req.http.Cookie ~ « wordpress_ » || req.http.Cookie ~ « comment_ ») {
return (pass);
}
if (!req.http.cookie) {
unset req.http.cookie;
}….
}
Enfin, il y a une erreur de programmation dans wordpress, qui ne renvoi pas le content-length sur les requêtes ajax en html. En m’inspirant de cet article, j’ai remplacé dans le fichier « wp-includes/class-wp-admin-ajax-response.php » cela :
public function send() {
header( ‘Content-Type: text/xml; charset=’ . get_option( ‘blog_charset’ ) );echo « <?xml version=’1.0′ encoding=' » . get_option( ‘blog_charset’ ) . « ‘ standalone=’yes’?><wp_ajax> »;
foreach ( (array) $this->responses as $response )
echo $response;
echo ‘</wp_ajax>’;
if ( defined( ‘DOING_AJAX’ ) && DOING_AJAX )
wp_die();
else
die();
}
par
public function send() {
$xml = « <?xml version=’1.0′ encoding=' » . get_option(‘blog_charset’) . « ‘ standalone=’yes’?><wp_ajax> »;
foreach ( (array) $this->responses as $response )
$xml .= $response;
$xml .= ‘</wp_ajax>’;
$length = strlen($xml);
header(‘Content-Type: text/xml; charset=’ . get_option(‘blog_charset’));
header(‘Content-Length: ‘.$length);
header(‘Date: ‘.date(DATE_RFC1123));
echo $xml;
if ( defined( ‘DOING_AJAX’ ) && DOING_AJAX )
wp_die();
else
die();
}
On termine dans apache par désactiver gzip avec « SetEnv no-gzip 1 » (je n’ai pas trouvé plus propre depuis qu’on utilise mod_deflate) dans l’admin (fichier httpd.conf)
<Directory « /votre/url/vers/votresite.fr/wp-admin »>
SetEnv no-gzip 1
</Directory>
Et voilà ! Plus d’erreur pour Chrome, qui a enfin la longueur exacte de sa requête (pfiouuu) ! Avec tout cela, je devrais pouvoir vous mettre rapidement en place la nouvelle interface pour les commentaires notamment ! J’étais bloqué par rapport aux utilisateurs de chrome… See you soon 😉 !
Ou pas. J’ai encore un soucis, cette fois c’est les commentaires qui n’utilisent pas une méthode documentée. Grrr !