Jump to content

Appel ajax avec https


Recommended Posts

Bonjour,

 

Mon site est sur PrestaShop 1.6.0.9 avec un thème personnalisé, qui intègre bloc de recherche avec autocompletion.

Le https est activé (uniquement sur les pages contenant des données clients).

 

Mon problème est que sur les pages en https, l'autocompletion ne fonctionne pas, car le module fait appel à une url en http.

Dans la console j'ai l'erreur suivante :

Mixed Content: The page at 'https://www.beastybike.com/commande-rapide' was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint 'http://www.beastybike.com/modules/wpsearchblock/wpsearch_ajax.php?q=fixie&limit=9&timestamp=1487933911449&ajaxSearch=1&id_lang=2'. This request has been blocked; the content must be served over HTTPS.

 

Est-il possible de faire appel au fichier en question en https ?

 

Voici le script utilisé :

<script type="text/javascript">
        var moduleDir = "{$module_dir}";
        // <![CDATA[
        $('document').ready(function() {
            $("#search_query_{$blocksearch_type}").autocompleteCustom(moduleDir + "wpsearch_ajax.php", {
                minChars: 3,
                max: 9,
                width: 300,
                selectFirst: false,
                scroll: false,
                dataType: "json",
                formatItem: function(data, i, max, value, term) {
                    return value;
                },
                parse: function(data) {
                    var mytab = new Array();

                    for (var i = 0; i < data.length; i++) {

                        if (i == 8) {
                            var keyword = $("#search_query_{$blocksearch_type}").val();
                            data[i].pname = 'more_link';
                            data[i].product_link = keyword;
    
                            mytab[mytab.length] = { data: data[i], value: '<span class="ac_more_link">{l s='More Results...' mod='wpsearchblock'}</span>' };
                            
                            return mytab;
                        }
                        else {
                            if (data[i].pname.length > 35) {
                                var pname = jQuery.trim(data[i].pname).substring(0, 35).split(" ").slice(0, -1).join(" ") + "...";
                            } else {
                                var pname = data[i].pname;
                            }
                            mytab[mytab.length] = { data: data[i], value: '<img src="' + data[i].product_image + '" alt="' + data[i].pname + '" height="30" />' + '<span class="ac_product_name">' + pname + '</span>' };

                        }
                    }

                    return mytab;

                },
                extraParams: {
                    ajaxSearch: 1,
                    id_lang: {$cookie->id_lang}
                }
                
            }).result(function(event, data, formatted) {
                if (data.pname == 'more_link') {
                    $('#search_query_{$blocksearch_type}').val(data.product_link);
                    $('#searchbox').submit();
                } else {
                    $('#search_query_{$blocksearch_type}').val(data.pname);
                    document.location.href = data.product_link;
                }
            })
        });
        // ]]>
    </script>

J'ai essayé de le modifier en ajoutant en dur mon nom de domaine avec https, mais dans ce cas, ça ne marche plus sur aucune page car l'url avec https est redirigée vers http.

 

Merci d'avance pour votre aide.

Link to comment
Share on other sites

Bonjour,

Le problème est que votre request pointe systématiquement sur une adresse HTTP.
Donc comme vous l'avez remarqué, elle est bloquée depuis les pages servies en HTTPS (en application de la Same-origin Policy).
Vous devez construire l'adresse en tenant compte de la page depuis lequel l'appel est passé.
Exemple:

Dans le fichier de Class de votre module :

public function __construct()
{
    $this->name = 'NOM_DU_MODULE';
    [...]
    $this->path_myroot   = _PS_BASE_URL_.__PS_BASE_URI__;
    $this->path_mymodule = _MODULE_DIR_.$this->name;
}

public function hook_NOM_DU_HOOK($params)
{
    $base_dir_ssl = Tools::getHttpHost(true).__PS_BASE_URI__;
    $base_dir = $this->path_myroot;

    $this->context->smarty->assign(
        array(
            'base_dir' => $base_dir,
            'base_dir_ssl' => $base_dir_ssl,
            [...]
        )
    );
            
    [...]
}

Puis dans votre script JS (que vous devriez externaliser plutôt que de le laisser dans le .tpl):

<script type="text/javascript">
var protocol = window.location.protocol;
var baseDir;
if (protocol === 'https:') {
    baseDir = "{$base_dir_ssl}";
} else {
    baseDir = "{$base_dir}";
}
var moduleDir = "{$module_dir}";
var file = "wpsearch_ajax.php";
var urlR = baseDir + moduleDir + file;
        // <![CDATA[
        $('document').ready(function() {
            $("#search_query_{$blocksearch_type}").autocompleteCustom(urlR, {
                [...]
Link to comment
Share on other sites

  • 2 weeks later...

Je pense que le problème vient du fait que l'url en https est redirigée vers http.

Il faudrait forcer le https sur l'url https://www.beastybike.com/modules/wpsearchblock/wpsearch_ajax.php.

 

Oui, votre url est bien redirigée.

 

552789Sanstitre1.jpg

 

Soit vous désactivez le https strict (pas terrible, mais rapide), à moins d'avoir inscrit votre site auprès de HSTS preload, soit vous ajoutez une règle de redirection. Le mieux est de passer tout votre site en https, mais peut-être que cela suppose d'adapter d'éventuels modules qui utiliseraient des URLs en http écrites "en dur". Donc une alternative temporaire serait de modifier la redirection https > http, pour filtrer les URLs de ce module.

Link to comment
Share on other sites

Ce n'est pas vous qui avez mis en place la redirection http > https existante ? Elle est gérée depuis une interface (genre celle d'OVH) ? Par un administrateur système ?
 
Même si elle est écrite dans un fichier de configuration, une règle dans le .htaccess pourrait l'écraser et empêcher une boucle de redirections si vous indiquez le drapeau de réécriture "last". Mais bon, ce serait quand même mieux de faire les choses proprement et de régler toutes les redirections au même endroit.

Link to comment
Share on other sites

Non ce n'est pas moi qui ait mis en place ces redirections, c'est Prestashop qui gère ça.

Je pense que les redirections http > https et https > http sont gérées dans un fichier config de PrestaShop.

 

J'ai juste activé l'option SSL dans le back-office (uniquement sur les pages contenant des infos clients) dans Préférences > Générales.

Donc toutes les URL en http ont la redirection https vers http, et toutes les URL en https ont la redirection inverse.

 

J'ai essayé d'ajouter la règle suivante dans mon htaccess :

RewriteCond %{HTTPS} off
RewriteRule ^modules/wpsearchblock/wpsearch_ajax.php https://www.beastybike.com/modules/wpsearchblock/wpsearch_ajax.php [L,R=301]
 
Mais ça fait une boucle de redirection.
Normal, puisqu'il y a une redirection https > http quelque part dans un fichier config ou autre, puis une redirection http > https dans mon htaccess.
Link to comment
Share on other sites

 

Normal, puisqu'il y a une redirection https > http quelque part dans un fichier config ou autre, puis une redirection http > https dans mon htaccess.

 

 

Totalement. Désolé pour le mauvais conseil. Je ne connais pas l'interface de Prestashop Cloud, et donc à quel point il est possible de bidouiller. Je suppose quand même qu'il est possible de passer tout son site en https. Vous n'avez jamais essayé ?

Link to comment
Share on other sites

Je ne suis pas sur Prestashop Cloud.

 

J'aurais bien voulu passer tout le site en https, mais rediriger 100% des pages http vers https, j'ai peur que Google n'apprécie pas...

 

Je vais essayer de chercher s'il n'est pas possible de supprimer les redirections https > http pour les URL contenant /modules/.

 

Merci pour votre aide.

Link to comment
Share on other sites

Encore une fois désolé pour le mauvais conseil du début, car la redirection est effectuée par Prestashop lui-même (avec le code PHP). Ça me parait se compliquer la vie d'aller modifier le comportement du front controller pour arriver à vos fins.

 

C'est d'un point de vue backlinks que vous craignez le basculement http > https ? C'est certain que si le SEO est très important pour vous, il vous faut préparer l'opération un minimum. Sinon, le https représente un avantage SEO et ça devient un peu la norme pour avoir accès au HTTP2, service workers, push, etc...

Link to comment
Share on other sites

J'ai résolu mon problème !

 

La solution était très simple : il suffisait de supprimer la ligne suivante dans le fichier wpsearch_ajax.php :

include_once('../../init.php');

 

Ainsi, plus de redirection, l'url en question est accessible avec http et https.

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...