GeoIp-basierte Standardwährungsauswahl hinter Varnish


14

Ich möchte, dass ein Geschäft eine Standardwährung basierend auf der IP des Kunden mithilfe von GeoIP beim ersten Besuch auf intelligente Weise auswählt (ohne vorausgewähltes Währungs-Cookie). Das Geschäft befindet sich hinter Varnish und verwendet die hervorragende Terpentine-Erweiterung von Nexcess.

Die Erweiterung behandelt Geldstrafen, solange das Standard-Magento-Währungscookie für eine bestimmte Anforderung festgelegt ist.

Meine Gedanken zu diesem Zeitpunkt sind:

  1. Fügen Sie VCL zur Varnish-Konfiguration hinzu, um die GeoIP-Suche (in C) durchzuführen, und setzen Sie das Cookie auf die eingehende Anforderung, sofern es nicht bereits festgelegt ist.
  2. Hinzufügen eines zwischengespeicherten Blocks pro Benutzer, der die Suche durchführt und das Cookie setzt (obwohl dies dann beim Laden der ersten Seite nicht zutreffen würde)

Fehlt mir eine offensichtliche Technik - vielleicht ein clientseitiger JS für einen nicht zwischengespeicherten URL-Pfad, der die Entscheidung trifft?

Kennt jemand den besten Weg, dies zu tun?

Antworten:


4

Wir haben so etwas in der Produktion am Laufen (wir aktivieren oder deaktivieren das Hinzufügen zum Einkaufswagen und die Preisgestaltung abhängig vom Standort des Kunden).

Wir haben das "Varnish GeoIP-Modul" von https://github.com/leed25d/geoip-vmod ... erstellt und installiert. Dadurch wird in jeder Anforderung, die Magento erreicht, ein "X-GeoIP" -Header gesetzt, der das Land des Benutzers angibt. In Magento müssen Sie diesen Header erkennen und den Inhalt nach Bedarf anpassen.

Das letzte zu überwindende Problem ist, dass Varnish die generierte Seite zwischenspeichert und allen Kunden unabhängig von ihrem Land zur Verfügung stellt. Sie können das Caching für diese Seite "ausschalten", aber die Leistung leidet darunter. Daher ist dies auch nicht ideal. Unsere Lösung bestand darin, einen "Vary" -Header in unserer HTTP-Antwort zu senden, der Varnish anweist, unterschiedliche Objekte für unterschiedliche Werte des X-GeoIP-Headers zwischenzuspeichern, sodass für jedes Land des Besuchers eine andere Seite zwischengespeichert wird.

Einer meiner Kollegen bei Aligent hat ein Magento-Modul erstellt, das einen Helfer zum Abrufen des Ländercodes aus dem X-GeoIP-Header enthält (mit einem Fallback auf IP, wenn es nicht vorhanden ist, was für die Entwicklung nützlich ist), und einen Beobachter, der " Variieren Sie "Header. Wir haben das Modul als Open-Source-Lösung bereitgestellt. Informationen zur Implementierung finden Sie unter https://github.com/aligent/Aligent_GeoIP .


1

Sie können versuchen, die Servervariable X-Forwarded-For festzulegen und diese mit Geoip zu verwenden

 remove req.http.X-Forwarded-For;
 set req.http.X-Forwarded-For = client.ip;

Dies hilft jedoch nur dem Backend, die Währung für die erste Aufforderung, eine Produktseite anzugeben, korrekt festzulegen. Die zweite und die darauffolgenden Ansichten dieser Produktseite werden von jedem Benutzer von Varnish zwischengespeichert, sodass der Währungscode im Backend nicht richtig funktioniert. Ich denke, die Standardeinstellung des Cookies muss geschehen, bevor es das Backend erreicht?
Ashley Schroder

AJAX oder ESI enthalten, wenn Ihre Magento-Lack-Erweiterung dies unterstützt.
Dmytro Zavalkin

1

Ich habe das noch nie gemacht, aber was mir gerade einfällt:

Verwenden Sie libvmod-geoip, um den Ländercode zu bestimmen (haben diese Lackerweiterung nicht verwendet, seien Sie vorsichtig ;-)) https://github.com/lampeh/libvmod-geoip

Dann erweitern Sie die Hash-Funktion über sub vcl_hash(), um den Länderkürzel zu den Cache-Schlüsseln hinzuzufügen. So können Sie alles anhand der Landesvorwahl zwischenspeichern.

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

Sie fügen auch den Ländercode als Header hinzu, set req.http.X-GeoIP = geoip.client_country_code();so dass der Magento-Server das richtige Land bestimmen und das richtige Material liefern kann.

Dies ist nur eine Idee, die Sie möglicherweise verbessern müssen, aber sie hilft Ihnen hoffentlich dabei, eine gute Lösung zu finden :)

Sie können auch auf die Kundencookies zugreifen und nach einer Landesvorwahl / Währung suchen. Wenn diese eingestellt ist, können Sie einen anderen Weg gehen und die Geoip-Funktion nicht aufrufen.


0

Sie schlugen pro Benutzer das Zwischenspeichern vor, was Wahnsinn ist. Ihre Cachetrefferquote macht den Nutzen der Verwendung von Varnish nahezu zunichte. Ganz zu schweigen davon, dass Varnish durch seinen LRU-Mechanismus extrem hart daran arbeiten wird, alte Cache-Einträge pro Benutzer zu entfernen, um Platz für neue Cache-Einträge pro Benutzer zu schaffen.

Sie haben ein paar Möglichkeiten,

  1. Behalten Sie den Firnis, verwenden Sie das Firnis-Geoip-Modul, verwenden Sie das Caching pro Benutzer, erzielen Sie eine Trefferquote von 0% und verschwenden Sie alle Ihre Serverressourcen mit der Firnisinstanz.
  2. Behalte den Lack, benutze das Lack-Geoip-Modul, benutze einen ESI für jeden währungsbezogenen Block. Sie müssen das esi zwischenspeichern, andernfalls werden die Trefferquoten null sein.
  3. Behalte den Lack, benutze das Lack-Geoip-Modul und ändere einfach deine URL-Struktur. Wenn Sie für jede Währung eine andere URL haben (z. B. / usd, / can), haben Sie unverminderte Trefferquoten und es funktioniert fast einwandfrei.
  4. Grabenlack, dann funktioniert alles wie vorgesehen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.