Vernik ve Terebentin


9

Sunucumda Varnish'i her başlattığımda, kullanıcılarım için oturumlarımı kaybettiğimi görüyorum.

Bu benim müşterilerim alışveriş sepetlerini kaybettiriyor.

Vernik için bu normal bir davranış mı yoksa VCL'm suçlanacak mı? Görünüşe göre onun değil


Daha fazla bilgi.

Daha fazla araştırma yapıldığında, bu sorunun GitHub'daki Sayı 725 ile ilgili olduğu görülmektedir .

Magento kurulumum 1.9.1.0 sürümüdür. Tüm ön ucumun https altında çalıştırıldığı da söylenmelidir. SSL'yi sonlandırmak için Vernik önünde Pound kullanıyorum.

Bu sürümdeki varsayılan Magento davranışı, genellikle 'frontend_cid' olarak adlandırılan ikincil bir ön uç çerezi oluşturmaktır, MITM saldırılarına karşı test etmek için.

Turpentine tarafından oluşturulan VCL dosyası, geçersiz oturumlara neden olan bu çerezden geçmiyor gibi görünüyor.

Herkes VCL dosyasının Magento'nun İstemciye yaptığı çerezlerden nasıl geçtiğini açıklayabilir mi?


Bunu gerekli çerezleri üretemeyen Varnish'e daralttım.

Magento 1.9.1.0'dan itibaren, MITM saldırılarını engellemek için bir 'frontend_cid' çerezi tanıtıldı.

Bu Mage_Core_Model_Session_Abstract_Variensınıfta, 135. satırda bulunabilir

if (Mage::app()->getFrontController()->getRequest()->isSecure() && empty($cookieParams['secure'])) {
    // secure cookie check to prevent MITM attack
    $secureCookieName = $sessionName . '_cid';
    if (isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])
        && $_SESSION[self::SECURE_COOKIE_CHECK_KEY] !== md5($cookie->get($secureCookieName))
    ) {
        session_regenerate_id(false);
        $sessionHosts = $this->getSessionHosts();
        $currentCookieDomain = $cookie->getDomain();
        foreach (array_keys($sessionHosts) as $host) {
            // Delete cookies with the same name for parent domains
            if (strpos($currentCookieDomain, $host) > 0) {
                $cookie->delete($this->getSessionName(), null, $host);
            }
        }
        $_SESSION = array();
    }
    if (!isset($_SESSION[self::SECURE_COOKIE_CHECK_KEY])) {
        $checkId = Mage::helper('core')->getRandomString(16);
        $cookie->set($secureCookieName, $checkId, null, null, null, true);
        $_SESSION[self::SECURE_COOKIE_CHECK_KEY] = md5($checkId);
    }
}

Müşterilere güvenli bağlantılar sağlamak için Varnish, Magento'nun daha sonra söz konusu müşteriyi tanımlamak için kullanacağı bir 'ön uç' çerezi oluşturmalıdır. Şimdiye kadar, bunu gayet iyi yapıyor gibi görünüyor. Ancak, Magento 1.9.1.0'dan itibaren gibi görünüyor, şimdi de 'frontend_cid' çerezi oluşturması gerekiyor.

Vernik bunu yapmak zorundadır, çünkü yanıtı önbelleğe alarak 'ön uç' çerezlerini içeren yanıt başlığını da önbelleğe alır.

Bu nedenle, varsayılan olarak, Vernik, 'arama' veya 'geçiş' koşullarını işlerken arka ucun yanıt verdiği çerezleri patlatır. Bunu, aynı önbelleğe alınmış ön uç çereziyle (insanların oturumlarını tehlikeye atacak) birden fazla kullanıcının yayınlanmasını durdurmak için yapar.

Herhangi bir zaman verniği "boru" ile ele alırsa, Magento gerekli çerezleri oluşturabilir ve bunları kullanıcı tarayıcısına ekleyebilir. Bu, sistemin ilk doğrulamayı geçememesine, ancak kullanıcıya yeni bir oturum sağlamasına neden olur. Bu belirti, alışveriş sepeti kaybı veya alışveriş sepetine ürün ekleyememe olarak kendini gösterir.

Turpentin VCL, GET veya HEAD yöntem tipi OLMAYAN herhangi bir talebi vcl_recvfonksiyonda bu kodla görüldüğü gibi 'yönlendirecektir' :

// We only deal with GET and HEAD by default
// we test this here instead of inside the url base regex section
// so we can disable caching for the entire site if needed
if (!true || req.http.Authorization ||
    req.request !~ "^(GET|HEAD)$" ||
    req.http.Cookie ~ "varnish_bypass=1") {
    return (pipe);
}

Bu nedenle, belirti en çok kullanıcı sepetlerine bir öğe eklemeye çalıştığında veya ilk kez ödeme yapmaya çalıştığında fark edilir.


Nasıl düzeltilir?

Bu sorunun çözümünün Turpentine VCL'nin de gelen ziyaretçiler için bir 'frontend_cid' çerezi oluşturması ve sonra da terebentin modülünün şu anki oturuma 'frontend' çerezi için yaptığı gibi bu çerezi eklemesini sağlamak olduğuna inanıyorum.

Peki ... bunu nasıl uygularız?

Dikkat: Yanılmış olabilirim, Vernik için çok yeniyim, ama şimdi bunun için çok fazla saat geçirdim ve gördüğüm şey şu, herhangi bir destek şu anda çok takdir edilecektir.

NİHAİ GÜNCELLEME VE SEÇİM SABİTİM - 2015 10 30

Çerez Magento tarafından sunucuda rastgele oluşturulduktan ve müşteri oturumunda MD5 karma olarak saklandığından, vernikte bir 'frontend_cid' çerezi oluşturmak imkansızdır. Bu, harici olarak müşteri oturumu dışında oluşturmanızı engeller.

Bu konuda ortaya koyduğum en iyi çözüm, bunun yerine Magento'nun müşteri oturumlarını işleme biçiminin üzerine yazmaktır.

Şu anda Magento bunun gibi geçersiz oturumları ele alıyor:

IF
    The requested session by the customer is flagged as invalid
THEN
    Stop processing request
    Redirect to the appropriate page

Yeni mantığım şöyle:

IF
    The requested session by the customer is flagged as invalid
THEN
    Create a new session
    Complete the requested task
    Redirect to the appropriate page

Yeni yaklaşımım verniklemenin ilk ziyarette bile müşterilerin tepkisini ele almasını sağlıyor. Terebentin son uygulaması böyle değildir.


Benim Sorunum, Sayı # 829 - / nexcess / magento-turpentin / konular / 829 GitHub'da. VCL'imin bir kopyasını burada bulabilirsiniz.


GitHub'daki sorunum, burada bulunan çok daha eski bir sorunun kopyası olduğu için kapatıldı:

Sayı # 345


1
GitHub'da yeni bir sorun açtığını gördüm, yarın sabah kontrol edeceğim. Bu arada github.com/nexcess/magento-turpentine/issues/90 ve github.com/nexcess/magento-turpentine/issues/92 adreslerini kontrol edebilirsiniz .
mbalparda

bu imkansız, oturumlar magento ve kullanıcıların tarayıcısında saklanır, vernik onunla hiçbir ilgisi yoktur. bir şey muhtemelen yanlış yapılandırılmış.

Yanıtlar:


4

Bunun nedeni, çerez yolunuzu doğru şekilde ayarlamamanız olabilir.

Admin->Configuration->Web->Session Cookie ManagementHenüz yapmadıysanız , çerez ayarlarınızı yapmayı deneyin .

Alternatif olarak vernikte bir hata olabilir.


Teşekkürler @performadigital, biraz daha araştırma yaptım ve sorumu güncelliyorum.
Peter A

1

Sorununuzun son bir Terebentin güncellemesi ile çözüleceğinden şüpheleniyorum: https://github.com/nexcess/magento-turpentine/commit/66615b7cc987854e8671911ab6c3aa22afb808a2

Oturum oluşturma kaldırıldı # 806, # 345 ve diğer oturumlar, boş alışveriş sepetleri vb. İle ilgili sorunları giderir.

Yeni oturumlar için ilk sayfa yüklemesinde Verniğin atlanmasına neden olur.

Yani Varnish artık oturum çerezi taklit etmeye çalışmak zorunda değil (önbellekten ilk sayfa talebine yanıt verememe pahasına)

Bu değişikliğin bazı Magento müşterilerimiz için bu sorunu çözdüğünü tespit ettik ( www.section.io çalıştırıyoruz ).


1
Teşekkürler @mattnthat, önerilen çözümün farkındayım ama kabul edilebilir bulmuyorum. Sonunda farklı bir çözüm uyguladım. Magento'nun oturumun geçerli olup olmadığını kontrol etmesini sağladım ve senaryoyu sonlandırmak yerine yeni bir oturum başlatmasını ve isteği tamamlamasını sağladım.
Peter A
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.