Varnish之后基于GeoIp的默认货币选择


14

我希望商店在首次访问时根据客户的IP使用GeoIP来智能地选择默认货币(没有预先选择的货币cookie)。该商店使用Nexcess出色的Turpentine扩展名在Varnish后面。

只要在给定的请求中设置了标准的Magento货币Cookie,该扩展程序便可以处理货币罚款。

我现阶段的想法是:

  1. 当然,将VCL添加到Varnish配置中以进行GeoIP查找(在C语言中),并在入站请求上设置cookie(如果尚未设置)。
  2. 添加一个按用户缓存的块,该块将执行查找并设置cookie(尽管这将不适用于第一页加载)

我是否错过了一项显而易见的技术-可能是通过客户端JS进行非清漆缓存的URL路径来确定?

有谁知道最好的方法吗?

Answers:


4

我们已经在生产环境中运行了类似的东西(我们根据客户所在的位置启用或禁用添加到购物车和定价)。

我们从https://github.com/leed25d/geoip-vmod构建并安装了“ Varnish GeoIP模块” 。这会在到达Magento的每个请求中设置一个“ X-GeoIP”标头,以指示用户所在的国家。在Magento中,您需要检测此标头并根据需要自定义内容。

最后要解决的问题是Varnish将缓存生成的页面并将其提供给所有客户,无论他们身在何处。您可以“关闭”该页面的缓存,但是性能会受到影响,因此也不理想。我们的解决方案是在HTTP响应中发送“ Vary”标头,该标头告诉Varnish为X-GeoIP标头的不同值缓存不同的对象,因此我们为每个访问者所在的国家/地区缓存了一个不同的页面。

我在Aligent的一位同事创建了一个Magento模块,其中包含一个帮助程序,用于从X-GeoIP标头中提取国家代码(如果不存在,则回退到IP,这对开发很有用),并有一个观察者来发送“变化”标题。我们已经开放了该模块的源代码,如果您需要实现细节,请查看https://github.com/aligent/Aligent_GeoIP


1

您可以尝试设置X-Forwarded-For服务器变量,并将其与geoip一起使用

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

但这只会帮助后端正确设置第一个请求(例如商品页面)的货币。任何用户对该产品页面的第二个及后续视图都将由Varnish缓存,因此后端中的货币代码将无法正常运行?我认为Cookie的默认设置需要在到达后端之前进行?
Ashley Schroder

如果您的magento-varnish扩展支持,则包括AJAX或ESI。
Dmytro Zavalkin

1

我以前没有做过,但这是我想到的:

使用libvmod-geoip确定国家/地区代码(未使用此清漆扩展名,请小心;-))https://github.com/lampeh/libvmod-geoip

然后,您可以扩展哈希函数,sub vcl_hash()以将国家/地区代码添加到缓存键中。这样,您就可以根据国家/地区代码来缓存所有内容。

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

您还可以将国家/地区代码添加为标题,例如set req.http.X-GeoIP = geoip.client_country_code();magento服务器能够确定正确的国家/地区并提供正确的内容。

这只是一个想法,您可能需要改进它,但是希望可以帮助您找到一个好的解决方案:)

您还可以访问客户的Cookie并检查国家/地区代码/货币,如果设置了国家/地区/货币,请采用其他方法,并且不要调用geoip函数...


0

您建议为每个用户缓存,这很疯狂。您的缓存命中率几乎为零,这使您没有使用Varnish的任何好处。更不用说Varnish通过其LRU机制将非常努力,以处理旧的每用户缓存条目,从而为新的每用户缓存条目腾出空间。

您有几种选择,

  1. 保留清漆,使用varnish geoip模块,按用户缓存使用,命中率为0%,并在varnish实例上浪费所有服务器资源。
  2. 保留清漆,使用清漆geoip模块,对任何与货币相关的模块使用ESI。您将需要缓存esi,否则,命中率将为零。
  3. 保留Varnish,使用varnish geoip模块,仅更改URL结构。如果每种货币的网址都不同(例如/ usd,/ can),则点击率将保持不变,并且几乎可以完美运行。
  4. 沟涂清漆,那么一切都会按预期进行。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.