니스 뒤의 GeoIp 기반 기본 통화 선택


14

고객이 처음 방문했을 때 (선택된 통화 쿠키없이) GeoIP를 사용하여 고객의 IP를 기반으로 기본 통화를 지능적으로 선택하고 싶습니다. 이 매장은 Nexcess의 탁월한 Turpentine 확장을 사용하여 Varnish 뒤에 있습니다.

확장은 표준 마 젠토 통화 쿠키가 주어진 요청에 설정되어있는 한 통화를 잘 처리합니다.

이 단계에서 나의 생각은 :

  1. Varnish 설정에 VCL을 추가하여 GeoIP 조회 (C에서)를 수행하고 인바운드 요청에 쿠키를 설정하십시오 (아직 설정되지 않은 경우).
  2. 조회를 수행하고 쿠키를 설정하는 사용자 별 캐시 된 블록을 추가합니다 (첫 번째 페이지로드에는 적용되지 않음)

명백한 기술이 누락 되었습니까? 아마도 클라이언트 쪽 JS가 니스로 캐시되지 않은 URL 경로에 대한 결정을 내릴 수 있습니까?

누구든지 이것을 하는 가장 좋은 방법을 알고 있습니까?

답변:


4

우리는 프로덕션에서 이와 같은 것을 얻었습니다 (고객의 위치에 따라 카트에 추가 및 가격 추가를 활성화 또는 비활성화합니다).

우리는 https://github.com/leed25d/geoip-vmod 에서 "Varnish GeoIP 모듈"을 구축하고 설치했습니다 ... 이것은 사용자의 국가를 나타내는 Magento에 도달하는 각 요청에서 "X-GeoIP"헤더를 설정합니다. Magento 내에서이 헤더를 감지하고 필요에 따라 컨텐츠를 사용자 정의해야합니다.

극복해야 할 마지막 문제는 니스가 생성 된 페이지를 캐시하여 해당 국가에 관계없이 모든 고객에게 제공한다는 것입니다. 해당 페이지에 대한 캐싱을 "끄기"할 수 있지만 성능이 저하되므로 이상적이지 않습니다. 우리의 솔루션은 HTTP 응답에 "Vary"헤더를 전송하여 Varnish가 X-GeoIP 헤더의 다른 값에 대해 서로 다른 객체를 캐시하도록 지시함으로써 각 방문자의 국가마다 다른 페이지를 캐시하도록하는 것입니다.

Aligent의 동료 중 한 명이 X-GeoIP 헤더에서 국가 코드를 가져 오는 데 도움이되는 도우미 (존재하지 않는 경우 IP로 대체, 개발에 유용함)를 포함하는 Magento 모듈을 만들었습니다. 다름 "헤더. 우리는 모듈을 오픈 소싱 했으며 구현 세부 사항을 원한다면 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에 의해 캐시하므로 백엔드의 통화 코드가 제대로 실행되지 않습니까? 쿠키의 기본 설정이 백엔드에 도달하기 전에 발생해야한다고 생각합니까?
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();젠토 서버가 올바른 국가를 결정하고 올바른 내용을 전달할 수 있도록합니다.

이것은 단지 아이디어 일뿐입니다. 개선해야 할 수도 있지만 좋은 해결책을 찾는 데 도움이되기를 바랍니다. :)

고객 쿠키에 액세스하고 국가 코드 / 통화를 확인할 수 있으며 설정된 경우 다른 방식으로 이동하여 geoip 함수를 호출하지 마십시오 ...


0

사용자별로 캐싱을 제안했는데, 이는 광기입니다. 캐시 적중률은 니스를 처음 사용할 때의 이점을 거의 무효화하지 않습니다. 말할 것도없이 Varnish는 LRU 메커니즘을 통해 매우 열심히 노력하여 사용자 별 캐시 항목을 삭제하여 새로운 사용자 당 캐시 항목을위한 공간을 마련합니다.

몇 가지 옵션이 있습니다.

  1. 바니시를 유지하고, 바니시 지오 IP 모듈을 사용하고, 사용자 캐싱을 사용하고, 적중률이 0 %이며, 바니시 인스턴스에서 모든 서버 리소스를 낭비합니다.
  2. 바니시를 유지하고, 바니시 지오 IP 모듈을 사용하고, 통화 관련 블록에 ESI를 사용하십시오. 에세이를 캐시해야합니다. 그렇지 않으면 다시 적중률이 0이됩니다.
  3. 니스를 유지하고 니스 지오 IP 모듈을 사용하고 URL 구조 만 변경하십시오. 각 통화마다 다른 URL이있는 경우 (예 : / usd, / can) 적중률이 줄어들며 거의 완벽하게 작동합니다.
  4. Ditch Varnish를 사용하면 모든 것이 의도 한대로 작동합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.