Les redirections lors du passage en https sur PrestaShop

Lors du passage d’un site en https il est essentiel de rediriger chaque requête faite vers une page en http vers cette même page en https,  pour l’internaute certes mais aussi pour éviter des problèmes de contenu dupliqué qui pénalisent le référencement.

PrestaShop implémente judicieusement un mécanisme qui se charge d’effectuer automatiquement ces redirections dès que le paramètre “Activer le SSL sur tout le site” (dans préférences > générales) est activé. Ce système est selon moi la seule méthode valable pour effectuer ces redirection qui sont pourtant souvent faites via une règle mise en place dans le fichier htaccess à la racine du site ou encore dans le virtualhost apache, solutions que je qualifierai dans  la suite de cet article comme solutions liées à l’hébergement (faites par le serveur et non pas par php). Or à force de voir des clients mettre en place ce dernier type de redirection j’ai fini par douter du bon fonctionnennemt du système proposé par PrestaShop et je me suis donc plongé dans le code du CMS pour en avoir le coeur net.

Je vous livre ci-dessous les résultats de ce que j’ai observé pour les versions 1.5.2 à 1.7.2 de PrestaShop mais je préfère tout d’abord expliquer pourquoi je pense que les redirections mises en place au niveau de l’hébergement ne constituent pas une réponse adaptée.

Eviter les redirections multiples ou inutiles

Le problème posé par les redirections de type http vers https et mises en place au niveau de l’hébergement (htaccess, virtualhost etc) est que ces redirections vont être faites “en premier” et vont engendrer des redirections multiples ou inutiles.

Considérons une page de site que nous appellerons “la-page” et accessible sur l’url http://mon-domaine/la-page. Notre système de redirection mis en place au niveau de l’hébergement va rediriger notre page vers https://mon-domaine/la-page et jusqu’ici tout va bien.

Si cette page était demain supprimée nous obtiendrons l’enchaînement d’en-têtes HTTP suivants pour toute requête faite sur http://mon-domaine/la-page:

301 : la page a été déplacé (vers https://mon-domaine/la-page, la redirection vers la version https de la page)
404 : la page n’existe pas (la-page a été supprimée)

Et oui, car la redirection au niveau de l’hébergement sera faite bien avant que PrestaShop n’intervienne et détermine que la page n’existe pas. Evidemment nous nous attendrions à obtenir un code 404 tout de suite et aucune redirection 301 dans ce cas précis.

Si cette même page était connue et bénéficiait par exemple de backlink nous aurions tout intérêt à la rediriger vers une page contenant un contenu proche. A moins de gérer toutes nos redirections (https vers https et pages supprimées) dans le htaccess (et dans un ordre maîtrisé), ce qui n’est pas une très bonne pratique pour des raisons de rapidité et de maintenance nous obtiendrions alors très probablement le résultat suivant (deux redirections, une de trop) :
301 : http://mon-domaine/la-page -> https://mon-domaine/la-page
301 : https://mon-domaine/la-page -> https://mon-domaine/une-autre-page

La bonne solution

Dans les exemples précédents les problèmes de redirections multiples ou inutiles surviennent car les redirections liées au passage en https sont effectuées au niveau de l’hébergement et avant que PrestaShop ne soit lancé. La bonne méthode consisterait à effectuer les redirections éventuelles de pages supprimées (http://mon-domaine/la-page vers https://mon-domaine/une-autre-page) puis de laisser PrestaShop effectuer si besoin la redirection de la page http vers https.
Ceci est tout à fait possible en :

  • Utilisant un module de redirection intervenant suffisamment tôt dans le déroulement de PrestaShop (voir les explications techniques en fin d’article)
  • Laissant PrestaShop effectuer les redirections automatiques des pages http vers les pages correspondantes en https ce qui doit fonctionner sur la majorités des versions de PrestaShop comme nous le voyons au point suivant.

La redirection automatique de PrestaShop

La redirection automatiques des requêtes http est sensée être prise en charge par PrestaShop dès lors que les paramètres “Activer le SSL” et “Activer le SSL sur tout le site” sont activés. Je me suis donc plongé dans le code de PrestaShop pour voir sur quelles versions ces redirections étaient susceptible ne pas fonctionner.

Sur PrestaShop 1.5

  • De PS 1.5.2 à PS 1.5.5.0 inclus, la redirection automatique http vers https ne fonctionnera pas mais des solutions existent.
  • Sur PS 1.5.6 la redirection doit fonctionner (notons au passage que le paramètre “Activer le SSL sur tout le site” a été introduit sur cette version)

Sur Prestashop 1.6

Mise à part l’introduction de la méthode sslRedirection() dans la classe FrontController, le code est resté quasi inchangé de PrestaShop 1.6.0.1 à PrestaShop 1.6.1.17 et les redirections doivent fonctionner.

Sur Prestashop 1.7

Le code utilisé sur PrestasShop 1.6 a été repris sans modification et les redirections doivent fonctionner.

Remarque technique

si vous êtes sur une version de PrestaShop pour laquelle les redirections devraient fonctionner et ce n’est pas le cas je vous conseille de vérifier ce qui est retourné par la méthode Tools::usingSecureMode() dont PrestaShop se sert pour déterminer quel protocole est utilisé par la requête en cours. Comme cette méthode utilise exclusivement le tableau $_SERVER pour déterminer si la requête courante est faite en https ou https, le paramétrage du serveur peut tout à fait induire PrestaShop en erreur.

Quel module de redirection choisir / Précisions techniques sur le process de PrestaShop

Les redirections éventuelles des urls de pages qui n’existent plus, supprimées ou correspondant à une ancienne version du site par exemple, doivent être faites avant la redirection automatique des pages http vers leur équivalent https de PrestaShop (relisez le paragraphe expliquant pourquoi si besoin).
Ceci peut être fait dans le fichier htaccess avec tous les inconvénients cités plus haut ou avec un module qui devra donc agir au bon endroit. Renseignez-vous auprès du développeur.

Pour information, la redirection https vers https de PrestaShop intervient dans la méthode init() de la classe FrontController et qui est étendu (sert de base) par tous les contrôleurs du front-office c’est à dire relativement tôt dans le processus qui ressemble à peu près à ceci :

  • Instanciation de quelques objets comme le Contexte ou le Shop dans le fichier config
  • Instanciation du Dispatcher chargé de déterminer le contrôleur chargé de la page demandée.
  • Instanciation du contrôleur calculé par le Dispatcher et lancement de sa méthode run() qui appelle tout de suite la méthode init().

Afin de pouvoir intervenir avant la redirection http vers https de PrestaShop le module de redirection que vous choisirez, si vous souhaitez en utiliser un, peut utiliser une surcharge de toutes les méthodes appelés avant la redirection effectuée par PrestaShop (avec les problèmes éventuels de conflit entre modules), l’idéal étant plutôt que ce module se branche sur l’un des deux hooks appelés lors du dispatch à savoir le hook “moduleRoutes” ou le hook “actionDispatcher” (utilisé par le module Redirections Manager).