Selección de moneda predeterminada basada en GeoIp detrás de Varnish

14

Quiero que una tienda elija de manera inteligente una moneda predeterminada basada en la IP del cliente utilizando GeoIP cuando visite por primera vez (sin cookie de moneda preseleccionada). La tienda está detrás de Varnish utilizando la excelente extensión de trementina de Nexcess.

La extensión maneja la multa de moneda siempre que la cookie de moneda estándar de Magento se configure en una solicitud determinada.

Mis pensamientos en esta etapa son:

  1. Agregue VCL en la configuración de Varnish para realizar la búsqueda GeoIP (en C) y configure la cookie en la solicitud entrante, si aún no está configurada, por supuesto.
  2. Agregue un bloque en caché por usuario que realiza la búsqueda y establece la cookie (aunque esto no se aplicaría en la primera carga de la página)

¿Me estoy perdiendo una técnica obvia, tal vez algún JS del lado del cliente a una ruta de URL en caché sin barniz que haga la determinación?

¿Alguien sabe la mejor manera de hacer esto?

Ashley Schroder
fuente

Respuestas:

4

Tenemos algo como esto funcionando en producción (estamos habilitando o deshabilitando agregar al carrito y precios dependiendo de la ubicación del cliente).

Construimos e instalamos el "módulo GeoIP Varnish" de https://github.com/leed25d/geoip-vmod ... Esto establece un encabezado "X-GeoIP" en cada solicitud que llega a Magento indicando el país del usuario. Dentro de Magento, debe detectar este encabezado y personalizar el contenido según sea necesario.

El último problema a superar es que Varnish almacenará en caché la página generada y la servirá a todos los clientes, independientemente de su país. Puede "desactivar" el almacenamiento en caché para esa página, pero el rendimiento se ve afectado, por lo que tampoco es ideal. Nuestra solución fue enviar un encabezado "Vary" en nuestra respuesta HTTP, que le dice a Varnish que guarde en caché diferentes objetos para diferentes valores del encabezado X-GeoIP, por lo que tenemos una página diferente en caché para el país de cada visitante.

Uno de mis colegas de Aligent ha creado un módulo Magento que contiene un ayudante para obtener el código de país del encabezado X-GeoIP (con respaldo a IP si no está presente, lo cual es útil para el desarrollo), y un observador para enviar el " Variar "encabezado. Hemos abierto el módulo, consulte https://github.com/aligent/Aligent_GeoIP si desea los detalles de implementación.

Jim OHalloran
fuente
1

Puede intentar establecer la variable de servidor X-Fordered-For y usar esto con geoip

 remove req.http.X-Forwarded-For;
 set req.http.X-Forwarded-For = client.ip;
Anton S
fuente
Pero eso solo ayudará al backend a establecer correctamente la moneda de la primera solicitud para decir una página de producto. Varnish almacenará en caché la segunda y posteriores vistas de la página de ese producto, por cualquier usuario, por lo que el código de moneda en el backend no se ejecutará, ¿verdad? ¿Creo que la configuración predeterminada de la cookie debe ocurrir antes de que llegue al backend?
Ashley Schroder
AJAX o ESI incluyen si su extensión magento-barniz lo admite.
Dmytro Zavalkin
1

No he hecho esto antes, pero esto es lo que se me pasa por la mente:

Use libvmod-geoip para determinar el código de país (no he usado esta extensión de barniz, tenga cuidado ;-)) https://github.com/lampeh/libvmod-geoip

Luego extiende la función hash sub vcl_hash()para agregar el código de país a las claves de caché. Eso le permite almacenar en caché todo según el código de país.

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

También agrega el código del país como encabezado, de set req.http.X-GeoIP = geoip.client_country_code();modo que el servidor de magento pueda determinar el país correcto y entregar el material correcto.

Esto es solo una idea, es posible que deba mejorarlo, pero con suerte lo ayudará a encontrar una buena solución :)

También puede acceder a las cookies de los clientes y verificar el código de país / moneda y, si está configurado, ir por un camino diferente y no llamar a la función geoip ...

thebod
fuente
0

Sugirió el almacenamiento en caché por usuario, lo cual es una locura. Sus tasas de aciertos de caché serán casi nulas y anularán cualquier beneficio de usar Varnish en primer lugar. Sin mencionar que Varnish trabajará extremadamente duro a través de su mecanismo LRU para deshacerse de las entradas antiguas de caché por usuario para hacer espacio para nuevas entradas de caché por usuario.

Tienes pocas opciones,

  1. Mantenga el barniz, use el módulo geoip de barniz, use el almacenamiento en caché por usuario, tenga tasas de aciertos del 0% y desperdicie todos los recursos del servidor en la instancia de barniz.
  2. Mantenga el barniz, use el módulo geoip de barniz, use un ESI para cualquier bloque relacionado con la moneda. Tendrá que almacenar en caché el esi, de lo contrario, nuevamente, las tasas de aciertos serán nulas.
  3. Mantenga Varnish, use el módulo geoip de barniz y simplemente cambie su estructura de URL. Si tiene una URL diferente para cada moneda (por ejemplo, / usd, / can), tendrá tasas de éxito no disminuidas y funcionará casi sin problemas.
  4. Ditch Varnish, entonces todo funcionará según lo previsto.
choco-loo
fuente