2013-04-30 12 views

Odpowiedz

5

Jeśli nie przeszkadza języków są na różnych adresach URL, terpentyny może obsłużyć to dla ciebie: https://github.com/nexcess/magento-turpentine/issues/36

Jeśli chcesz, żeby zachowywać się jak robią po wyjęciu z pudełka, kontynuujmy.

Trzeba zmodyfikować jak lakier generuje posiada w swojej Reference VCL : https://www.varnish-cache.org/trac/wiki/VCLExampleCachingLoggedInUsers

Chcielibyśmy zmodyfikować to również uwzględniać cookie sklepu, który ustawia Magento w oparciu o wybór języka. (Postępowanie tutaj: http://demo.magentocommerce.com) Niestety jest to trudne, ponieważ Varnish zwykle nie przekazuje plików cookie z powrotem do serwera lub nie zapisuje w pamięci podręcznej plików, gdy widzi ciasteczka latające wokół:

To by miało pamięć podręczną Varnish na podstawie wartości pliku cookie a także domyślny adres URL i gospodarz:

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); 
} 

ale z tej metody może trzeba dostosować resztę VCL buforować stronę prawidłowo i wysłać ciasteczka z powrotem do serwera

Inną opcją jest użycie pliku cookie, aby zmienić buforowanie na dowolnym nagłówku, nazwijmy go 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=(.*?))(?:;|$)"); 
} 

Wzór ten jest również stosowany do wykrywania urządzeń lakierem: https://github.com/varnish/varnish-devicedetect/blob/master/INSTALL.rst

Następnie trzeba by przedłużyć Mage_Core_Model_App używać tego nagłówka zamiast „Store” cookie. W Magento CE 1.7 jej _checkCookieStore:

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; 
} 

Można by ustawić aktualny sklep na $ _SERVER [ 'X-Mag-Lang'] zamiast cookie

+0

Korzystanie z buforowania rozwiązań plików cookie dotyczyłoby tylko jednego użytkownika. –

+0

To nie jest plik cookie sesji, to powoduje wyłączenie wartości cookie, która ma język w nim – timbroder

+0

OK, mój błąd. Ładny przegląd anway. –

1

Dodaj następujący wierszy Varnish Config

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

jaki jest efekt tych linii? Czy to najlepsza lub najkrótsza odpowiedź? ;) – fbtb