2013-04-30 26 views

Trả lời

5

Nếu bạn không nhớ các ngôn ngữ được tại các url khác nhau, Turpentine có thể xử lý việc này cho bạn: https://github.com/nexcess/magento-turpentine/issues/36

Nếu bạn muốn họ cư xử như họ làm ra khỏi hộp, cho phép tiếp tục.

Bạn phải thay đổi như thế nào véc ni tạo ra có trong VCL tham khảo của bạn: https://www.varnish-cache.org/trac/wiki/VCLExampleCachingLoggedInUsers

Chúng tôi sẽ sửa đổi này cũng phải đưa vào tài khoản các cookie lưu trữ mà bộ Magento dựa trên bộ chọn ngôn ngữ. (Thực hiện theo hành vi ở đây: http://demo.magentocommerce.com) Thật không may điều này trở nên khó khăn vì Varnish có xu hướng không chuyển cookie trở lại máy chủ hoặc không lưu vào bộ nhớ cache khi thấy cookie bay quanh

Điều này sẽ có bộ nhớ cache Varnish dựa trên giá trị của cookie cũng như các url mặc định và host:

sub vcl_hash { 
     hash_data(req.url); 
     hash_data(req.http.host); 

     if (req.http.Cookie ~ "(?:^|;\s*)(?:store=(.*?))(?:;|$)"){ 
       hash_data(regsub(req.http.Cookie, "(?:^|;\s*)(?:store=(.*?))(?:;|$)")); 
     } 

     return (hash); 
} 

Nhưng, với phương pháp này bạn có thể phải tinh chỉnh phần còn lại của VCL của bạn để cache trang đúng cách và gửi các tập tin cookie lại cho máy chủ

Một lựa chọn khác là sử dụng cookie để thay đổi bộ nhớ đệm trên một tiêu đề tùy ý, cho phép gọi nó là X-Mage-L ang:

sub vcl_fetch { 
    #can do this better with regex 
    if (req.http.Cookie ~ "(?:^|;\s*)(?:store=(.*?))(?:;|$)"){ 
     if (!beresp.http.Vary) { # no Vary at all 
      set beresp.http.Vary = "X-Mage-Lang"; 
     } elseif (beresp.http.Vary !~ "X-Mage-Lang") { # add to existing Vary 
      set beresp.http.Vary = beresp.http.Vary + ", X-Mage-Lang"; 
     } 
    } 
    # comment this out if you don't want the client to know your classification 
    set beresp.http.X-Mage-Lang = regsub(req.http.Cookie, "(?:^|;\s*)(?:store=(.*?))(?:;|$)"); 
} 

Mô hình này cũng được sử dụng để phát hiện thiết bị với véc ni: https://github.com/varnish/varnish-devicedetect/blob/master/INSTALL.rst

Sau đó, bạn sẽ phải mở rộng Mage_Core_Model_App sử dụng tiêu đề này thay cho 'cửa hàng' cookie. Trong Magento CE 1,7 _checkCookieStore của nó:

protected function _checkCookieStore($type) 
{ 
    if (!$this->getCookie()->get()) { 
     return $this; 
    } 

    $store = $this->getCookie()->get(Mage_Core_Model_Store::COOKIE_NAME); 
    if ($store && isset($this->_stores[$store]) 
     && $this->_stores[$store]->getId() 
     && $this->_stores[$store]->getIsActive()) { 
     if ($type == 'website' 
      && $this->_stores[$store]->getWebsiteId() == $this->_stores[$this->_currentStore]->getWebsiteId()) { 
      $this->_currentStore = $store; 
     } 
     if ($type == 'group' 
      && $this->_stores[$store]->getGroupId() == $this->_stores[$this->_currentStore]->getGroupId()) { 
      $this->_currentStore = $store; 
     } 
     if ($type == 'store') { 
      $this->_currentStore = $store; 
     } 
    } 
    return $this; 
} 

Bạn sẽ thiết lập các cửa hàng hiện hành về $ _SERVER [ 'X-Mage-Lang'] thay vì cookie

+0

Sử dụng bộ nhớ đệm giải pháp cookie sẽ chỉ áp dụng cho một người dùng. –

+0

Đây không phải là cookie phiên, nó kích hoạt giá trị của cookie có ngôn ngữ trong đó – timbroder

+0

Ok, lỗi của tôi. Anway tổng quan đẹp. –

1

Add Sau dòng trong Varnish Config,

if(beresp.http.Set-Cookie) { 
    return (hit_for_pass); 
} 
+0

ảnh hưởng của những dòng này là gì? Đây có phải là câu trả lời ngắn nhất hay chỉ là câu trả lời ngắn nhất? ;) – fbtb