Выбор валюты по умолчанию на основе GeoIp за Varnish


14

Я хочу, чтобы магазин разумно выбирал валюту по умолчанию на основе IP-адреса клиента, используя GeoIP при первом посещении (без предварительно выбранного cookie-файла с валютой). Магазин находится за Лаком, используя превосходное расширение Скипидара Nexcess.

Расширение обрабатывает штраф в валюте, если для данного запроса установлен стандартный файл cookie валюты Magento.

Мои мысли на этом этапе:

  1. Добавьте VCL в конфигурацию Varnish, чтобы выполнить поиск GeoIP (в C), и установите cookie для входящего запроса, если он, конечно, еще не установлен.
  2. Добавьте кешированный блок для каждого пользователя, который выполняет поиск и устанавливает cookie (хотя это не будет применяться при первой загрузке страницы)

Я упускаю очевидный метод - может быть, какой-нибудь JS на стороне клиента для пути URL без кэширования, который определяет?

Кто-нибудь знает лучший способ сделать это?

Ответы:


4

У нас есть что-то вроде этого, запущенное в производство (мы включаем или отключаем добавление в корзину и цены в зависимости от местоположения клиента).

Мы создали и установили «Модуль Varnish GeoIP» с https://github.com/leed25d/geoip-vmod ... Это устанавливает заголовок «X-GeoIP» в каждом запросе, который достигает Magento, указывая страну пользователя. В Magento вам нужно обнаружить этот заголовок и настроить содержимое по мере необходимости.

Последняя проблема, которую необходимо преодолеть, заключается в том, что Varnish будет кэшировать сгенерированную страницу и предоставлять ее всем клиентам независимо от их страны. Вы можете «отключить» кэширование для этой страницы, но производительность страдает, так что это тоже не идеально. Нашим решением было отправить заголовок «Vary» в нашем HTTP-ответе, который говорит 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 по умолчанию должна произойти, прежде чем он попадет на сервер?
Эшли Шредер

AJAX или ESI включают, если ваше расширение magento-Polish поддерживает это.
Дмитрий Завалкин

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. Сохраняйте лак, используйте модуль geoip для лака, используйте кеширование для каждого пользователя, коэффициент попадания 0% и тратите все ресурсы сервера на экземпляр лака.
  2. Держите лак, используйте модуль geoip для лака, используйте ESI для любого блока, связанного с валютой. Вам нужно будет кэшировать ESI, в противном случае, опять же, частота попаданий будет равна нулю.
  3. Держите Varnish, используйте модуль geoip для лака и просто измените структуру URL. Если у вас есть разные URL-адреса для каждой валюты (например, / usd, / can), то у вас будет постоянный рейтинг попаданий, и он будет работать почти безупречно.
  4. Дитч Лак, тогда все будет работать как надо.
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.