Lựa chọn tiền tệ mặc định dựa trên GeoIp đằng sau Varnish


14

Tôi muốn một cửa hàng chọn thông minh một loại tiền tệ mặc định dựa trên IP của khách hàng bằng GeoIP khi họ truy cập lần đầu (không có cookie tiền tệ được chọn trước). Cửa hàng đứng sau Varnish sử dụng phần mở rộng Turpentine tuyệt vời của Nexcess.

Tiện ích mở rộng xử lý tiền tệ miễn là cookie tiền tệ Magento tiêu chuẩn được đặt theo yêu cầu nhất định.

Suy nghĩ của tôi ở giai đoạn này là:

  1. Thêm VCL vào cấu hình Varnish để thực hiện tra cứu GeoIP (bằng C) và đặt cookie theo yêu cầu gửi đến, tất nhiên nếu nó chưa được đặt.
  2. Thêm một khối được lưu trong bộ nhớ cache cho mỗi người dùng thực hiện tra cứu và đặt cookie (mặc dù điều này sau đó sẽ không áp dụng cho lần tải trang đầu tiên)

Tôi có đang thiếu một kỹ thuật rõ ràng - có thể một số JS phía máy khách đến đường dẫn URL không được lưu trong bộ nhớ cache để đưa ra quyết định không?

Có ai biết cách tốt nhất để làm điều này?

Câu trả lời:


4

Chúng tôi đã có một cái gì đó như thế này đang chạy trong sản xuất (chúng tôi đang kích hoạt hoặc vô hiệu hóa thêm vào giỏ hàng và giá cả tùy thuộc vào vị trí của khách hàng).

Chúng tôi đã xây dựng và cài đặt "mô-đun GeoIP Varnish" từ https://github.com/leed25d/geoip-vmod ... Điều này đặt tiêu đề "X-GeoIP" trong mỗi yêu cầu đến Magento cho biết quốc gia của người dùng. Trong Magento, bạn cần phát hiện tiêu đề này và tùy chỉnh nội dung theo yêu cầu.

Vấn đề cuối cùng cần khắc phục là Varnish sẽ lưu trữ trang được tạo và phục vụ nó cho tất cả khách hàng bất kể quốc gia của họ. Bạn có thể "tắt" bộ nhớ đệm cho trang đó, nhưng hiệu suất bị ảnh hưởng, vì vậy điều đó cũng không lý tưởng. Giải pháp của chúng tôi là gửi tiêu đề "Khác nhau" trong phản hồi HTTP, điều này cho Varnish lưu trữ các đối tượng khác nhau cho các giá trị khác nhau của tiêu đề X-GeoIP, vì vậy chúng tôi có một trang khác nhau được lưu trong bộ đệm cho mỗi quốc gia của khách truy cập.

Một trong những đồng nghiệp của tôi tại Aligent đã tạo ra một mô-đun Magento chứa trình trợ giúp để lấy mã quốc gia từ tiêu đề X-GeoIP (có dự phòng thành IP nếu không có, rất hữu ích cho việc phát triển) và người quan sát gửi " Thay đổi tiêu đề ". Chúng tôi đã mở nguồn mô-đun, hãy xem https://github.com/aligent/Aligent_GeoIP nếu bạn muốn chi tiết triển khai.


1

Bạn có thể thử và đặt biến máy chủ X-Forwarded-For và sử dụng biến này với Geoip

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

Nhưng điều đó sẽ chỉ giúp phụ trợ đặt chính xác tiền tệ cho yêu cầu đầu tiên để nói một trang sản phẩm. Lượt xem thứ hai và tiếp theo của trang sản phẩm đó, bởi bất kỳ người dùng nào, sẽ được lưu trữ bởi Varnish và vì vậy mã tiền tệ trong phần phụ trợ sẽ không chạy đúng không? Tôi nghĩ rằng cài đặt mặc định của cookie cần phải xảy ra trước khi nó chạm vào phụ trợ?
Ashley Schroder

AJAX hoặc ESI bao gồm nếu phần mở rộng magento-véc ni của bạn hỗ trợ nó.
Dmytro Zavalkin

1

Tôi chưa từng làm điều này trước đây, nhưng đây là điều tôi nghĩ:

Sử dụng libvmod-Geoip để xác định mã quốc gia (chưa sử dụng tiện ích mở rộng véc ni này, hãy cẩn thận ;-)) https://github.com/lampeh/libvmod-geoip

Sau đó, bạn mở rộng hàm băm thông qua sub vcl_hash()để thêm mã quốc gia vào các khóa bộ đệm. Điều đó cho phép bạn lưu trữ mọi thứ dựa trên mã quốc gia.

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

Bạn cũng thêm mã quốc gia làm tiêu đề, như set req.http.X-GeoIP = geoip.client_country_code();vậy máy chủ magento có thể xác định quốc gia chính xác và cung cấp nội dung chính xác.

Đây chỉ là một ý tưởng, bạn có thể cần phải cải thiện nó, nhưng hy vọng sẽ giúp bạn tìm ra giải pháp tốt :)

Bạn cũng có thể truy cập cookie của khách hàng và kiểm tra mã quốc gia / loại tiền tệ và, nếu được đặt, hãy đi theo một cách khác và không gọi hàm Geoip ...


0

Bạn đề xuất cho mỗi người dùng bộ nhớ đệm, đó là điên rồ. Tỷ lệ trúng bộ nhớ cache của bạn sẽ gần như không làm mất đi bất kỳ lợi ích nào của việc sử dụng Varnish ở vị trí đầu tiên. Chưa kể Varnish sẽ làm việc cực kỳ chăm chỉ thông qua cơ chế LRU của mình để xử lý các mục nhập bộ nhớ cache cũ trên mỗi người dùng để tạo không gian cho các mục nhập bộ nhớ cache mới cho mỗi người dùng.

Bạn có một vài lựa chọn,

  1. Giữ véc ni, sử dụng mô đun Geoip véc ni, sử dụng cho mỗi bộ nhớ cache của người dùng, có tỷ lệ trúng 0% và lãng phí tất cả tài nguyên máy chủ của bạn trên ví dụ véc ni.
  2. Giữ véc ni, sử dụng mô đun Geoip véc ni, sử dụng ESI cho bất kỳ khối liên quan đến tiền tệ. Bạn sẽ cần phải lưu trữ esi, nếu không, một lần nữa, tỷ lệ trúng sẽ là không.
  3. Giữ Varnish, sử dụng mô đun Geoip véc ni và chỉ cần thay đổi cấu trúc URL của bạn. Nếu bạn có một url khác nhau cho mỗi loại tiền tệ (ví dụ: / usd, / can), thì bạn sẽ có tỷ lệ trúng không đáng kể và nó sẽ hoạt động gần như hoàn hảo.
  4. Ditch Varnish, sau đó mọi thứ sẽ hoạt động như dự định.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.