Tuto complet : https / ssl avec PrestaShop

PrestaShop

Activer le ssl / https sur sa boutique PrestaShop est aujourd’hui une nécessité pour rassurer, pour se conformer aux exigences de Google et pour vendre sur des marketplaces également. Ayant des clients sur la version 1.5 de PrestaShop et celle-ci étant plus compliquée pour un passage à la connexion sécurisée, voici un tuto détaillé.

 

Activation du https sur PrestaShop

Le tuto présenté ici est effectué sur la version 1.5.3.1 de PrestaShop car moins claire que la version 1.6 et 1.7 de PrestaShop. IMPORTANT : ce tuto peut aussi fonctionner avec les versions de PrestaShop 1.6 et supérieures.
Pour rappel, vous avez besoin d’un certificat SSL à commander auprès de votre hébergeur pour activer le HTTPS sur votre boutique.
Pas besoin d’être un expert PrestaShop mais un peu de prudence, je vous conseille de faire une sauvegarde complète des fichiers et de la base de données. Une fois la sauvegarde terminée, rendez-vous dans le back office > préférences > général et activez le https en cliquant sur la phrase noire « Please click here to use HTTPS protocol before enabling SSL » (CF capture d’écran).
préférences activer ssl prestashop
Une fois que cette option est activée, vous avez désormais sur cette même page la possibilité d’activer ou non le SSL.
préférences activer ssl prestashop
 

Régénération du htaccess de PrestaShop 1.5

Afin de bien rediriger les urls sur le https://votrenomdedomaine.com, rendez-vous dans le back office > préférences > SEO & URLS et vérifiez que les champs « Domaine » et « Domaine SSL » sont bien remplis avec votre nom de domaine y compris les www.
régénérer les urls prestashop https
Pour vérifier que le SSL est bien fonctionnel sur votre site, connectez-vous à l’administration de PrestaShop et vérifiez la présence du https comme suit :
https prestashop
Et normalement ça devrait fonctionner partout sur votre site, sauf les pages produits toujours en http:// et la question : pourquoi ? Vous trouverez la solution à votre problème dans la suite de l’article.
 

Corrections des erreurs courantes avec le HTTPS et PrestaShop

 

La connexion n’est pas sécurisée sur votre boutique malgré tout

En activant le HTTPS sur votre site, vous devez charger tous les éléments de votre site en HTTPS, qu’ils soient internes ou externes à votre site. Pour vérifier cela, ouvrez votre navigateur (Google Chrome dans mon cas) et faites un clic droit puis « Inspecter ». Un fenêtre du navigateur va s’ouvrir et occuper une partie de l’écran. Dans cette fenêtre, cliquez sur « Console » dans le menu. Si vous lisez des « Mixed Content » alors vous avez un problème de contenu chargé en HTTP donc votre site n’est pas sécurisé.
mixed content prestashop https
Il vous faut alors savoir où sont appelés chaque élément pour modifier l’url et basculer en https. La plupart du temps, vérifiez dans les modules qui proposent des éditeurs WYSIWYG (éditeur visuel) et dont le contenu peut être des images.
 

Vous avez une boucle de redirection sur les fiches produits

Après pas mal de recherche, c’est un bug natif à PrestaShop que l’on peut corriger en faisant un override de la Class Link.php et plus précisément en modifiant la fonction getProductLink à la ligne 94 (PrestaShop 1.5.3.1). Remplacez le http:// pour https:// et ça fonctionne. Voici le code complet de la fonction modifiée :

public function getProductLink($product, $alias = null, $category = null, $ean13 = null, $id_lang = null, $id_shop = null, $ipa = 0, $force_routes = false)
 {
 $dispatcher = Dispatcher::getInstance();
 
 if (!$id_lang)
 $id_lang = Context::getContext()->language->id;
 
 if (!$id_shop)
 $shop = Context::getContext()->shop;
 else
 $shop = new Shop($id_shop);
  
 $url = 'https://'.$shop->domain.$shop->getBaseURI().$this->getLangLink($id_lang);
 
 if (!is_object($product))
 {
 if (is_array($product) && isset($product['id_product']))
 $product = new Product($product['id_product'], false, $id_lang);
 else if (is_numeric($product) || !$product)
 $product = new Product($product, false, $id_lang);
 else
 throw new PrestaShopException('Invalid product vars');
 }
 
 // Set available keywords
 $params = array();
 $params['id'] = $product->id;
 $params['rewrite'] = (!$alias) ? $product->getFieldByLang('link_rewrite') : $alias;
 $params['ean13'] = (!$ean13) ? $product->ean13 : $ean13;
 $params['meta_keywords'] = Tools::str2url($product->getFieldByLang('meta_keywords'));
 $params['meta_title'] = Tools::str2url($product->getFieldByLang('meta_title'));
 
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'manufacturer'))
 $params['manufacturer'] = Tools::str2url($product->isFullyLoaded ? $product->manufacturer_name : Manufacturer::getNameById($product->id_manufacturer));
 
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'supplier'))
 $params['supplier'] = Tools::str2url($product->isFullyLoaded ? $product->supplier_name : Supplier::getNameById($product->id_supplier));
 
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'price'))
 $params['price'] = $product->isFullyLoaded ? $product->price : Product::getPriceStatic($product->id, false, null, 6, null, false, true, 1, false, null, null, null, $product->specificPrice);
 
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'tags'))
 $params['tags'] = Tools::str2url($product->getTags($id_lang));
  
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'category'))
 $params['category'] = Tools::str2url($product->category);
  
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'reference'))
 $params['reference'] = Tools::str2url($product->reference);
 
 if ($dispatcher->hasKeyword('product_rule', $id_lang, 'categories'))
 {
 $params['category'] = (!$category) ? $product->category : $category;
 $cats = array();
 foreach ($product->getParentCategories() as $cat)
 if (!in_array($cat['id_category'], array(1, 2)))//remove root and home category from the URL
 $cats[] = $cat['link_rewrite'];
 $params['categories'] = implode('/', $cats);
 }
 $anchor = $ipa ? $product->getAnchor($ipa) : '';
 
 return $url.$dispatcher->createUrl('product_rule', $id_lang, $params, $force_routes, $anchor);
 }

 

Votre boutique ne s’affiche plus et vous avez l’erreur ERR_TOO_MANY_REDIRECTS

Si votre navigateur affiche le code erreur ERR_TOO_MANY_REDIRECTS, il se peut que vous ayez oublié d’activer l’option « activer le SSL sur tout le site » dans le back office > Préférences > Générales.
[EDIT du 26/10/2018]
Voici une autre piste pour corriger l’erreur ERR_TOO_MANY_REDIRECTS sur PrestaShop qui n’est en fait qu’une boucle de redirection. Il faut modifier la fonction redirectLink() de la classe Tools.php comme suit :

/**
* Redirect URLs already containing PS_BASE_URI
*
* @param string $url Desired URL
*/
public static function redirectLink($url)
{
	if (!preg_match('@^https?://@i', $url))
	{
		if (strpos($url, __PS_BASE_URI__) !== false && strpos($url, __PS_BASE_URI__) == 0)
			$url = substr($url, strlen(__PS_BASE_URI__));
		if (strpos($url, 'index.php?controller=') !== false && strpos($url, 'index.php/') == 0)
			$url = substr($url, strlen('index.php?controller='));
		$explode = explode('?', $url);
		$url = Context::getContext()->link->getPageLink($explode[0]);
		if (isset($explode[1]))
			$url .= '?'.$explode[1];

		$url = str_replace('http://', 'https://', $url);
		header('Location: '.$url);
		exit;
	}
}

 

Les liens sont cassés dans les descriptions produits

Pour corriger les anciens liens en http, deux solutions :
1/ Soit vous corrigez à la volée en appliquant du smarty dans les modèles d’affichage TPL du thème (je vous conseille la seconde piste) :
descriptions longues des produits

{$product->description|replace:'http://':'https://'}

descriptions courtes des produits
{$product->description_short|replace:'http://':'https://'}

contenu des pages CMS
{$cms->content|replace:'http://':'https://'}


 
2/ Soit vous remplacez toutes les urls dans la base de données et dans ce cas, faites une sauvegarde ! Connectez-vous à PhpMyAdmin puis lancez les requêtes suivantes en remplaçant par votre nom de domaine :
table ps_configuration (paramètres de la boutique)

UPDATE ps_configuration SET value = REPLACE(value, 'http://www.maboutique.tld', 'https://www.maboutique.tld') WHERE INSTR(value, 'http://www.maboutique.tld') > 0;

table ps_product_lang (descriptions courtes des produits)
UPDATE ps_product_lang SET description_short = REPLACE(description_short, 'http://www.maboutique.tld', 'https://www.maboutique.tld') WHERE INSTR(description_short, 'http://www.maboutique.tld') > 0;

table ps_product_lang (descriptions longues des produits)
UPDATE ps_product_lang SET description = REPLACE(description, 'http://www.maboutique.tld', 'https://www.maboutique.tld') WHERE INSTR(description, 'http://www.maboutique.tld') > 0;

table ps_cms_lang (pages de contenu CMS)
UPDATE ps_cms_lang SET content = REPLACE(content, 'http://www.maboutique.tld', 'https://www.maboutique.tld') WHERE INSTR(content, 'http://www.maboutique.tld') > 0;

 

Vérification du passage au HTTPS de PrestaShop

Une fois le tuto suivi, votre boutique est désormais en https mais il est primordial de vérifier que toutes les variantes d’urls pointent bien vers votre boutique. Par exemple si votre boutique est https://www.maboutique.com, il faut que http://www.maboutique.com pointe vers le https.
Vous pouvez vérifier via le site : http://www.redirect-checker.org/index.php
Une fois que vous avez rentré votre adresse en HTTP, le résultat affiché est du genre :

Result
http://www.maboutique.com/
301 Moved Permanently
https://www.maboutique.com/
200 OK

Dans le cas présent, la redirection permanente / 301 est bien active donc tout est normal. Si ce n’est pas le cas, lisez la suite de l’article.
 

Créer redirection 301 vers PrestaShop en HTTPS

Si votre site n’est pas en https lorsque vous tapez dans la barre d’adresse https://www.maboutique.com alors ouvrez le fichier .htaccess à la racine de votre hébergement. Ajoutez en début de fichier les lignes suivantes après avoir fait une sauvegarde du fichier :

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.votredomaine.fr/$1 [R=301,L]

 
A partir de maintenant, votre boutique PrestaShop est sécurisée en HTTPS / SSL ! Pensez également à ajouter votre nouveau site https dans Google Search Console (anciennement Webmaster Tools) et à basculer votre site en https dans Google Analytics. Attention également aux éventuelles redirections d’urls à prendre en compte.
 

20 commentaires sur “Tuto complet : https / ssl avec PrestaShop

  1. Hello,
    Merci d’avoir fait un retour sur le SSL / HTTS et de nous avoir donné ton expérience sur le sujet.
    Parfois il faut creuser le bug, car l’erreur « ERR_TOO_MANY_REDIRECTS » est vraiment contraignante et devoir modifier les classes est une étape pénible (personnellement j’ai dû bien souvent aller plus loin que la méthode getProductLink).
    De mon côté j’ai abordé aussi cette problématique pour Prestashop 1.4 : https://www.webbax.ch/2017/05/24/ssl-prestashop-1-4/
    Et à voir aussi pour les versions du type Prestashop 1.7 :
    https://www.webbax.ch/2017/06/05/prestashop-1-7-ajouter-ssl-https-ep-23/
    A bientôt !

    1. Hello Germain,
      En effet, c’est penible de devoir aller modifier des éléments tels que des Class ou des Controllers. J’ai insisté sur PrestaShop 1.5 car c’est la version la plus compliquée pour passer en https je trouve. Merci pour ton retour 😉

  2. Un grand merci pour la précision concernant le fichier Link.php.
    En effet, celui-ci bloquait la collecte des produits et l’exploration de google.

  3. Je n’ai pas compris comment modifier les url pour les images. Pas de précisions ? Dans quel fichier aller ? Merci d’avance.

    1. Bonjour Marnik,
      Merci pour le commentaire,
      Il se peut au passage https que certains contenus soient gérés avec des éditeur comme ceux pour les produits et catégories.
      Dans ce cas, les liens et les urls des images doivent être corrigés dans ces éditeurs pour ajouter le https au lieu du http.
      A bientôt 🙂

  4. Bonjour,
    Merci beaucoup pour tous ces conseils qui m’ont permis de passer mon site en HTTPS
    il me reste cependant un problème que je n’arrive pas à résoudre sur la page du choix de paiement,
    celle-ci n’est pas sécurisée en raison du mixed content ci-dessous (ancien module Twenga)
    Chargement du contenu mixte actif « http://tracker.twenga.fr/e2d052ef28495e232ead12f88e2580d7 » (non sécurisé) sur une page sécurisée[En savoir plus]
    commande
    Chargement du contenu mixte actif « http://tracker.twenga.fr/e2d052ef28495e232ead12f88e2580d7 » (non sécurisé) sur une page sécurisée[En savoir plus]
    commande
    Échec du chargement pour l’élément dont la source est « http://tracker.twenga.fr/e2d052ef28495e232ead12f88e2580d7 ».
    commande:17
    ça fait plusieurs jours que je cherche et je ne trouve pas comment faire
    si vous pouviez m’aider je vous en serai très reconnaissant car là je bloque

    1. Bonjour Jean-Noel,
      Merci pour votre message,
      Il me semble que pour les trackers vous pouvez soit utiliser un module qui gère le https, soit remplacer l’url appelée donc remplacer manuellement l’url http:// par https:// et ça devrait fonctionner.
      A bientôt

  5. Bonjour,
    Merci pour les détails.
    J’ai testé le process sur un PS 1.5.5.0, j’ai plusieurs problèmes :
    1- il n’y a pas d’option « activer le SSL sur tout le site » dans l’admin ! (pourtant ma version est plus récente que celle de cet article)
    2- le .htaccess est bien regénéré, mais son contenu n’a pas changé !
    3- sur le front rien n’est en httpS, le pire c’est quand je saisie une URL en httpS ça fait une redirection (301) vers la version http
    Qu’est ce qui ne va pas avec cette version ? dois-je mettre à jour vers la 1.5.6 ?
    Merci d’avance 🙂

    1. Bonjour Sami,
      1) Il n’y a pas d’option pour activer le SSL sur tout le site en effet, je viens de compléter l’article avec une autre piste dans la partie « Votre boutique ne s’affiche plus et vous avez l’erreur ERR_TOO_MANY_REDIRECTS ».
      2) Dans ce cas il faut vérifier si il est bien chmod 666 via votre client FTP.
      3) A placer dans le .htaccess le point « Créer redirection 301 vers PrestaShop en HTTPS »
      La mise à jour n’est pas nécessaire même si ça serait un plus pour la correction de bugs / améliorations apportées, etc.
      Courage 🙂

  6. Merci pour cet excellent article, j’ai pu passer mon site multiboutique 1.6.1.20 en SSL en 30 min ! Je n’ai pas eu de problème de bouclage. Vos scripts pour les liens à corriger en BDD ont marché parfaitement. J’ai ensuite corrigé manuellement quelques liens externes (youtube notamment) et c’est tout. Bref que du bonheur et me voic avec 2 beaux cadenas verts ! Merci encore

  7. Bonjour,
    j’ai passé mon site qui est vraiment trop lent sur GTmetrix et j’ai commencé à régler quelques soucis
    il m’affiche systématiquement cette erreur
    Avoid landing page redirects for the following chain of redirected URLs.
    http://www.sweetlovemessage.fr/
    http://sweetlovemessage.fr/
    https://sweetlovemessage.fr/
    auriez-vous une idée pour m’aider à régler ça? je tourne un peu en rond après avoir essayé pas mal de petite chose sans succès je n’arrive pas à résoudre ce problème
    merci
    Vanessa

  8. Bonjour
    je regarde tous les tutos sur le sujet et je tourne en rond tout de même. je travaille sur la version 1.7, la fonction ssl ne s’active pas sur mon site. Je n’arrive donc pas a passer en https. Je n’aime pas ça mais je suis rentré dans le code en voyant un tuto de Webbax mais j’ai toujours l’erreur ERR_TOO_MANY_REDIRECTS.
    lorsque je fais le test pour savoir si la boutique supporte le ssl, l’url passe en https mais le bouton « activer le ssl sur tout le site » reste grisé.
    Y a t il moyen de forcer le la commande se trouvant dans le BO?
    merci a vous

    1. Bonjour,
      Pour forcer le HTTPS, il faut aller dans la table configuration puis chercher les entrées avec « SSL » et passer la valeur à 1.
      Bon courage !

      1. Bonjour Arnaud
        Mon problème est réglé grâce a votre intervention, suite au changement de valeur dans la base tout passe en HTTPS. Merci encore. Je vais livrer le requêtes sur le post initial pour les autres utilisateurs.
        merci
        philippe

  9. Bonjour,
    Merci pour ce tuto, excellent comme bien d’autres. J’ai fait les modifications et il me semble que le site en Front office est bien sécurisé sportgoodies.fr/shop par contre pour la partie back office je ne le suis pas est-ce normal ?
    Merci

    1. Bonjour Pascal,
      Il est possible en effet de se connecter à l’admin de PrestaShop en http bien que le front office soit en https.
      Aucun souci de ce côté là 😉

Laisser un commentaire

Consultez les autres articles