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_Varien
sı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_recv
fonksiyonda 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ı: