Selezione valuta predefinita basata su GeoIp dietro Varnish


14

Voglio che un negozio scelga in modo intelligente una valuta predefinita in base all'IP del cliente utilizzando GeoIP alla prima visita (senza cookie di valuta preselezionato). Il negozio è dietro Varnish usando l'eccellente estensione di trementina di Nexcess.

L'estensione gestisce la valuta fino a quando il cookie di valuta Magento standard è impostato su una determinata richiesta.

I miei pensieri in questa fase sono:

  1. Aggiungi VCL nella configurazione di Varnish per eseguire la ricerca GeoIP (in C) e impostare il cookie sulla richiesta in entrata, se non è già impostato, ovviamente.
  2. Aggiungi un blocco memorizzato nella cache per utente che esegue la ricerca e imposta il cookie (anche se questo non si applicherebbe al caricamento della prima pagina)

Mi sto perdendo una tecnica ovvia - forse un JS sul lato client in un percorso URL non memorizzato nella cache che determina?

Qualcuno conosce il modo migliore per farlo?

Risposte:


4

Abbiamo qualcosa di simile in esecuzione in produzione (stiamo abilitando o disabilitando l'aggiunta al carrello e i prezzi a seconda della posizione del cliente).

Abbiamo creato e installato il "modulo GeoIP Varnish" da https://github.com/leed25d/geoip-vmod ... Questo imposta un'intestazione "X-GeoIP" in ogni richiesta che raggiunge Magento indicando il paese dell'utente. All'interno di Magento è necessario rilevare questa intestazione e personalizzare il contenuto come richiesto.

L'ultimo problema da superare è che Varnish memorizzerà nella cache la pagina generata e la servirà a tutti i clienti indipendentemente dal loro paese. Potresti "disattivare" la memorizzazione nella cache per quella pagina, ma le prestazioni ne risentono, quindi neanche questo è l'ideale. La nostra soluzione era di inviare un'intestazione "Vary" nella nostra risposta HTTP, che dicesse a Varnish di memorizzare nella cache oggetti diversi per valori diversi dell'intestazione X-GeoIP, quindi abbiamo una pagina diversa memorizzata nella cache per il paese di ciascun visitatore.

Uno dei miei colleghi di Aligent ha creato un modulo Magento che contiene un aiuto per recuperare il codice del paese dall'intestazione X-GeoIP (con fallback in IP se non è presente, che è utile per lo sviluppo) e un osservatore per inviare il " Vary "header. Abbiamo aperto il modulo, consulta https://github.com/aligent/Aligent_GeoIP se desideri i dettagli di implementazione.


1

Puoi provare a impostare la variabile del server X-Forwarded-For e utilizzarla con geoip

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

Ma questo aiuterà solo il backend a impostare correttamente la valuta per la prima richiesta di dire una pagina del prodotto. La seconda e le successive visualizzazioni di quella pagina del prodotto, da parte di qualsiasi utente, verranno memorizzate nella cache da Varnish e quindi il codice valuta nel backend non verrà eseguito correttamente? Penso che l'impostazione predefinita del cookie debba essere eseguita prima che colpisca il backend?
Ashley Schroder,

AJAX o ESI includono se l'estensione di vernice magento lo supporta.
Dmytro Zavalkin,

1

Non l'ho mai fatto prima, ma cos'è questo che mi viene in mente:

Usa libvmod-geoip per determinare il codice del paese (non ho usato questa estensione di vernice, fai attenzione ;-)) https://github.com/lampeh/libvmod-geoip

Quindi estendi la funzione hash tramite sub vcl_hash()per aggiungere il codice paese alle chiavi della cache. Ciò consente di memorizzare nella cache tutto in base al prefisso internazionale.

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

Aggiungete anche il prefisso internazionale come intestazione, in set req.http.X-GeoIP = geoip.client_country_code();modo che il server magento sia in grado di determinare il paese corretto e consegnare le cose corrette.

Questa è solo un'idea, potresti aver bisogno di migliorarla, ma spero ti aiuti a trovare una buona soluzione :)

Puoi anche accedere ai cookie dei clienti e verificare la presenza di un codice paese / valuta e, se impostato, andare in un modo diverso e non chiamare la funzione geoip ...


0

Hai suggerito la memorizzazione nella cache per utente, che è una follia. Le percentuali di hit della cache saranno quasi nulle, annullando in primo luogo i vantaggi dell'utilizzo di Varnish. Per non parlare del fatto che Varnish lavorerà molto duramente attraverso il suo meccanismo LRU per smaltire le voci della cache precedente per utente per creare spazio per le voci della cache per nuovo utente.

Hai alcune opzioni,

  1. Mantieni la vernice, usa il modulo geoip di vernice, usa la cache per utente, ottieni percentuali di hit dello 0% e sprecare tutte le risorse del tuo server sull'istanza di vernice.
  2. Mantieni la vernice, usa il modulo geoip di vernice, usa un ESI per qualsiasi blocco relativo alla valuta. Dovrai memorizzare nella cache ESI, altrimenti, di nuovo, le percentuali di hit saranno pari a zero.
  3. Mantieni la vernice, usa il modulo geoip di vernice e modifica la struttura dell'URL. Se hai un URL diverso per ogni valuta (ad es. / Usd, / can), avrai tassi di hit non diminuiti e funzionerà quasi perfettamente.
  4. Ditch Varnish, quindi tutto funzionerà come previsto.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.