notes/prestashop-cookies-renommes-400
PrestaShop renomme ses cookies à chaque montée, et nginx refuse le domaine
Le nom d'un cookie PrestaShop dépend de la version. Les anciens restent envoyés pendant 480 heures, et l'en-tête finit par dépasser le seuil de nginx.
- prestashop
- nginx
- cookies
Une boutique PrestaShop en mutualisé, montée de la 8.1.4 à la 8.2.8, rend "400 Request Header Or Cookie Too Large" sur tout le domaine, fichiers statiques compris. Le nginx en façade est celui d'ea-nginx, devant Apache. Seul le navigateur qui servait le site avant la montée est touché.
Le nom d'un cookie PrestaShop se calcule à partir de la version : PrestaShop- suivi d'un md5 de la version, du nom logique du cookie et du domaine (classes/Cookie.php). Le cookie de la boutique a pour nom logique ps-s<id_shop>, celui du back-office psAdmin. Une montée change donc le nom de tous les cookies. Les anciens ne sont plus lus, mais le navigateur continue de les envoyer jusqu'à leur expiration, fixée par PS_COOKIE_LIFETIME_FO et _BO, 480 heures sur cette boutique.
Le module Store Commander pose en plus deux cookies PrestaShop sur le chemin /, scAdmin et scSession. À sa première ouverture après la montée, la nouvelle génération s'ajoute à l'ancienne. L'en-tête Cookie dépasse 8 Ko, et nginx refuse toutes les requêtes du domaine. Le seuil mesuré se situe entre 8 100 et 8 200 octets. Côté nginx, le réglage en cause est large_client_header_buffers, resté à sa valeur par défaut : quatre tampons de 8 k. Apache derrière a le même plafond (LimitRequestFieldSize).
Le journal d'accès le montre : statut 400 avec un corps de 226 octets. Pour Chrome ou MSIE, nginx ajoute 402 octets de bourrage, et le corps passe à 628 octets. La réponse 400 d'Apache, elle, fait 439 octets.
Pour rejouer le refus sans session, curl -H "Cookie: x=<9000 caractères>" https://<site>/ suffit. Pour vérifier la formule, printf '%s' "8.2.8ps-s1<domaine>" | md5 rend le suffixe du cookie que la version 8.2.8 sert à la boutique numéro 1.
Le remède : effacer les cookies du site dans le navigateur.
Ne relève pas la limite de nginx pour tout un mutualisé. Avant toute montée de version, préviens les utilisateurs du back-office, et ceux de Store Commander en premier, qu'ils devront effacer les cookies du site.
retour aux notes