การเลือกสกุลเงินเริ่มต้นตาม GeoIp อยู่หลังวานิช


14

ฉันต้องการให้ร้านค้าเลือกอย่างชาญฉลาดเลือกสกุลเงินเริ่มต้นตาม IP ของลูกค้าโดยใช้ GeoIP เมื่อพวกเขาเข้าชมครั้งแรก (โดยไม่มีคุกกี้สกุลเงินที่เลือกไว้ล่วงหน้า) ร้านอยู่ด้านหลังวานิชโดยใช้ Turpentine extension ที่ยอดเยี่ยมของ Nexcess

ส่วนขยายจัดการสกุลเงินที่ดีตราบใดที่คุกกี้สกุลเงินวีโอไอพีมาตรฐานถูกตั้งค่าตามคำขอที่กำหนด

ความคิดของฉันในขั้นตอนนี้คือ:

  1. เพิ่ม VCL ลงในการตั้งค่าวานิชเพื่อทำการค้นหา GeoIP (ใน C) และตั้งค่าคุกกี้ตามคำขอขาเข้าหากไม่ได้ตั้งค่าไว้แน่นอน
  2. เพิ่มบล็อกแคชต่อผู้ใช้ที่ค้นหาและตั้งค่าคุกกี้ (แม้ว่าจะไม่ใช้กับการโหลดหน้าแรก)

ฉันขาดเทคนิคที่เห็นได้ชัด - บางที JS ฝั่งไคลเอ็นต์ไปยังพา ธ URL ที่ไม่เคลือบเงาที่ทำให้มีการกำหนดหรือไม่

ไม่มีใครรู้วิธีที่ดีที่สุดในการทำเช่นนี้?

คำตอบ:


4

เรามีบางอย่างที่กำลังดำเนินการอยู่ (เรากำลังเปิดใช้งานหรือปิดใช้งานการเพิ่มในรถเข็นและราคาขึ้นอยู่กับสถานที่ตั้งของลูกค้า)

เราสร้างและติดตั้ง "Varnish GeoIP module" จากhttps://github.com/leed25d/geoip-vmod ... นี่เป็นการตั้งค่าส่วนหัว "X-GeoIP" ในแต่ละคำขอที่มาถึง Magento เพื่อระบุประเทศของผู้ใช้ ภายใน Magento คุณต้องตรวจหาส่วนหัวนี้และปรับแต่งเนื้อหาตามต้องการ

ปัญหาสุดท้ายที่จะเอาชนะคือวานิชจะทำการแคชเพจที่สร้างขึ้นและให้บริการกับลูกค้าทุกคน คุณสามารถ "ปิด" การแคชสำหรับหน้านั้น แต่ประสิทธิภาพลดลงดังนั้นจึงไม่เหมาะเช่นกัน วิธีแก้ปัญหาของเราคือส่งส่วนหัว "แตกต่าง" ในการตอบกลับ HTTP ของเราซึ่งแจ้งให้วานิชทำการแคชวัตถุที่แตกต่างกันสำหรับค่าที่ต่างกันของส่วนหัว 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 ดังนั้นรหัสสกุลเงินในแบ็กเอนด์จะไม่ทำงานใช่ไหม ฉันคิดว่าการตั้งค่าเริ่มต้นของคุกกี้ต้องเกิดขึ้นก่อนที่จะกระทบแบ็กเอนด์หรือไม่
Ashley Schroder

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 สามารถกำหนดประเทศที่ถูกต้องและส่งมอบสิ่งที่ถูกต้อง

นี่เป็นเพียงความคิดคุณอาจต้องปรับปรุง แต่หวังว่าจะช่วยให้คุณหาทางออกที่ดี :)

นอกจากนี้คุณยังสามารถเข้าถึงคุกกี้ลูกค้าและตรวจสอบรหัสประเทศ / สกุลเงินและหากตั้งไว้จะใช้วิธีอื่นและไม่เรียกฟังก์ชัน geoip ...


0

คุณแนะนำต่อผู้ใช้แคชซึ่งเป็นความบ้า อัตราการเข้าชมแคชของคุณเกือบจะเป็นโมฆะไม่มีประโยชน์ใด ๆ ของการใช้วานิชในสถานที่แรก ไม่ต้องพูดถึงวานิชจะทำงานอย่างหนักผ่านกลไก LRU เพื่อกำจัดรายการเก่าต่อรายการแคชของผู้ใช้เพื่อสร้างพื้นที่สำหรับรายการใหม่ต่อรายการแคชของผู้ใช้

คุณมีตัวเลือกน้อย

  1. เก็บวานิชใช้โมดูล geoip เคลือบเงาใช้ต่อการแคชของผู้ใช้มีอัตราการเข้าชม 0% และใช้ทรัพยากรเซิร์ฟเวอร์ของคุณทั้งหมดบนอินสแตนซ์วานิช
  2. เก็บวานิชให้ใช้โมดูล geoip เคลือบเงาใช้ ESI สำหรับบล็อกที่เกี่ยวข้องกับสกุลเงิน คุณจะต้องแคช esi มิฉะนั้นอีกครั้งอัตราการเข้าชมจะเป็นศูนย์
  3. เก็บ Varnish ใช้โมดูล geoip เคลือบเงาและเพียงแค่เปลี่ยนโครงสร้าง URL ของคุณ หากคุณมี URL ที่แตกต่างกันสำหรับแต่ละสกุลเงิน (เช่น. / usd, / can) คุณจะมีอัตราการเข้าชมที่ไม่ลดน้อยลงและจะทำงานได้อย่างไร้ที่ติ
  4. Ditch Varnish จากนั้นทุกอย่างจะทำงานตามที่ตั้งใจไว้
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.