Sélection de devise par défaut basée sur GeoIp derrière Varnish

14

Je veux qu'un magasin choisisse intelligemment une devise par défaut en fonction de l'IP du client utilisant GeoIP lors de sa première visite (sans cookie de devise présélectionné). Le magasin est derrière Varnish utilisant l'excellente extension Turpentine de Nexcess.

L'extension gère correctement la devise tant que le cookie de devise Magento standard est défini sur une demande donnée.

À ce stade, mes réflexions sont les suivantes:

  1. Ajoutez VCL dans la configuration Varnish pour effectuer la recherche GeoIP (en C) et définissez le cookie sur la demande entrante, si elle n'est pas déjà définie, bien sûr.
  2. Ajoutez un bloc mis en cache par utilisateur qui effectue la recherche et définit le cookie (bien que cela ne s'applique pas lors du premier chargement de page)

Suis-je en train de manquer une technique évidente - peut-être un JS côté client vers un chemin d'URL sans cache de vernis qui fait la détermination?

Quelqu'un connaît-il la meilleure façon de procéder?

Ashley Schroder
la source

Réponses:

4

Nous avons quelque chose comme ça en cours de production (nous activons ou désactivons l'ajout au panier et les prix en fonction de l'emplacement du client).

Nous avons construit et installé le "module Varnish GeoIP" de https://github.com/leed25d/geoip-vmod ... Cela définit un en-tête "X-GeoIP" dans chaque demande qui atteint Magento indiquant le pays de l'utilisateur. Dans Magento, vous devez détecter cet en-tête et personnaliser le contenu selon vos besoins.

Le dernier problème à surmonter est que Varnish mettra en cache la page générée et la servira à tous les clients quel que soit leur pays. Vous pouvez "désactiver" la mise en cache pour cette page, mais les performances en souffrent, ce n'est donc pas idéal non plus. Notre solution a été d'envoyer un en-tête "Vary" dans notre réponse HTTP, qui indique à Varnish de mettre en cache différents objets pour différentes valeurs de l'en-tête X-GeoIP, nous avons donc une page différente en cache pour le pays de chaque visiteur.

Un de mes collègues chez Aligent a créé un module Magento qui contient une aide pour récupérer le code pays de l'en-tête X-GeoIP (avec repli sur IP s'il n'est pas présent, ce qui est utile pour le développement), et un observateur pour envoyer le " Vary "header". Nous avons ouvert le module open source, consultez https://github.com/aligent/Aligent_GeoIP si vous souhaitez les détails d'implémentation.

Jim OHalloran
la source
1

Vous pouvez essayer de définir la variable de serveur X-Forwarded-For et l'utiliser avec geoip

 remove req.http.X-Forwarded-For;
 set req.http.X-Forwarded-For = client.ip;
Anton S
la source
Mais cela n'aidera que le backend à définir correctement la devise pour la première demande de dire une page de produit. La deuxième vue et les vues suivantes de cette page de produit, par n'importe quel utilisateur, seront mises en cache par Varnish et donc le code de devise dans le backend ne fonctionnera pas correctement? Je pense que le paramètre par défaut du cookie doit se produire avant qu'il n'atteigne le backend?
Ashley Schroder du
AJAX ou ESI incluent si votre extension magento-vernis le prend en charge.
Dmytro Zavalkin
1

Je ne l'ai pas fait auparavant, mais c'est ce qui me vient à l'esprit:

Utilisez libvmod-geoip pour déterminer le code du pays (vous n'avez pas utilisé cette extension de vernis, soyez prudent ;-)) https://github.com/lampeh/libvmod-geoip

Ensuite, vous étendez la fonction de hachage via sub vcl_hash()pour ajouter le code du pays aux clés de cache. Cela vous permet de tout mettre en cache en fonction du code pays.

sub vcl_hash {
    #...
    set req.hash += geoip.client_country_code();
    #...
}

Vous ajoutez également le code du pays comme en-tête, comme set req.http.X-GeoIP = geoip.client_country_code(); sorte que le serveur magento soit en mesure de déterminer le bon pays et de livrer les bonnes choses.

Ce n'est qu'une idée, vous devrez peut-être l'améliorer, mais j'espère que cela vous aidera à trouver une bonne solution :)

Vous pouvez également accéder aux cookies des clients et vérifier un code de pays / devise et, s'il est défini, procéder différemment et n'appeler pas la fonction geoip ...

thebod
la source
0

Vous avez suggéré la mise en cache par utilisateur, ce qui est de la folie. Vos taux d'accès au cache seront presque nuls annulant tout avantage d'utiliser Varnish en premier lieu. Sans oublier que Varnish travaillera extrêmement dur grâce à son mécanisme LRU pour éliminer les anciennes entrées de cache par utilisateur afin de faire de la place pour les nouvelles entrées de cache par utilisateur.

Vous avez quelques options,

  1. Gardez le vernis, utilisez le module geoip de vernis, utilisez la mise en cache par utilisateur, ayez des taux de succès de 0% et gaspillez toutes vos ressources de serveur sur l'instance de vernis.
  2. Gardez le vernis, utilisez le module geoip de vernis, utilisez un ESI pour tout bloc lié à la devise. Vous devrez mettre l'esi en cache, sinon, encore une fois, les taux de réussite seront nuls.
  3. Gardez Varnish, utilisez le module geoip de vernis et changez simplement la structure de votre URL. Si vous avez une URL différente pour chaque devise (par exemple. / Usd, / can), alors vous aurez des taux de réussite non diminués, et cela fonctionnera presque parfaitement.
  4. Ditch Varnish, alors tout fonctionnera comme prévu.
choco-loo
la source