Jump to content

[RESOLU] Activer le SSL + URL simplifiée (mod_rewrite) ne marche pas (Erreur 301) sur les pages SSL


Recommended Posts

Ce problème ne doit pas concerner tout le monde (je suis en simple hosting chez Gandi) et ne touche que les pages commandes, contact et compte client (celles qui sont forcées en SSL après l’activation de l’option SSL). Lorsqu’on accède à ces pages on obtient une erreur 301 de redirection.

 

Le problème se situe dans classes/controller/FrontController.php autour de la ligne 117.

if ($this->ssl && !Tools::usingSecureMode() && Configuration::get('PS_SSL_ENABLED'))
{
  header('HTTP/1.1 301 Moved Permanently');
  header('Cache-Control: no-cache');
  header('Location: '.Tools::getShopDomainSsl(true).$_SERVER['REQUEST_URI']);
  exit();
}

En regardant les variables utilisées dans la condition, la methode Tools::usingSecureMode() renvoie false alors qu’elle devrait renvoyer true. Par contre cette méthode renvoie true lorsque je visite une page produit quelconque en https.

En utilisant ($this->ssl && false && Configuration::get('PS_SSL_ENABLED')), cela semble marcher correctement.

La question est donc pourquoi usingSecureMode cesse de renvoyer true.

En examinant, la méthode :

public static function usingSecureMode()
{
  if (isset($_SERVER['HTTPS']))
  return ($_SERVER['HTTPS'] == 1 || strtolower($_SERVER['HTTPS']) == 'on');
  // $_SERVER['SSL'] exists only in some specific configuration
  if (isset($_SERVER['SSL']))
  return ($_SERVER['SSL'] == 1 || strtolower($_SERVER['SSL']) == 'on');

  return false;
}

Je remarque que $_SERVER['HTTPS'] renvoie ‘on’ sur les pages produits en https et ne renvoie rien sur les pages commandes, contact et compte client.

En faisant un dump de $_SERVER, je me rends compte que la variable $_SERVER['HTTPS'] n’existe pas, par contre on trouve ça [REDIRECT_HTTPS] => on . EUREKA !

 

Donc si je ne raconte pas n’importe quoi, on doit réécrire la méthode de cette manière :

public static function usingSecureMode()
{
  if (isset($_SERVER['HTTPS']))
  return ($_SERVER['HTTPS'] == 1 || strtolower($_SERVER['HTTPS']) == 'on');
  // $_SERVER['SSL'] exists only in some specific configuration
  if (isset($_SERVER['SSL']))
  return ($_SERVER['SSL'] == 1 || strtolower($_SERVER['SSL']) == 'on');
  // $_SERVER['REDIRECT_HTTPS'] exists only in some specific configuration
  if (isset($_SERVER['REDIRECT_HTTPS']))
  return ($_SERVER['REDIRECT_HTTPS'] == 1 || strtolower($_SERVER['REDIRECT_HTTPS']) == 'on');

  return false;
}

 

 

Je pense faire un push sur GitHub si vous trouvez ça correcte.

 

 

EDIT

 

Je viens de voir qu'on avait déjà proposé une solution utilisant :

 

if(isset($_SERVER['SCRIPT_URI']))
{
  //preg_match('^https', $_SERVER['SCRIPT_URI'])
  return ((strpos($_SERVER['SCRIPT_URI'], 'https') === 0) ? true : false);
}

 

L'avantage de cette solution c'est de ne pas chercher une 'réponse SSL' du serveur mais de voir si l'url contient https.

 

EDIT

 

La résolution du problème vient d'intégrer la version development de PrestaShop.

Edited by emily_d (see edit history)
Link to comment
Share on other sites

  • 1 month later...
  • 3 years later...

Je suis tombé ce poste qui m'a bien aiguillé pour arriver a installer le SSL gateway d'OVH:

https://www.ovh.com/fr/g2370.utilisation_du_ssl_gateway

 

Pour éviter les redirections en boucle, il suffit d'ajouter 2 lignes à la fonction function usingSecureMode() dans classes/Tools.php
juste avant "return false;"

if (isset($_SERVER['HTTP_X_FORWARDED_PORT'])) {
return Tools::strtolower($_SERVER['HTTP_X_FORWARDED_PORT']) == '443';
} 

Pensez aussi à mettre à "NON" le paramètre de backoffice "Vérifier l'adresse IP du cookie" dans le menu "administration=>Préférences

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...