मुझे लग रहा है कि जब भी मैं अपने सर्वर पर वार्निश को पुनः आरंभ करता हूं, मैं अपने उपयोगकर्ताओं के लिए अपने सत्र खो रहा हूं।
यह वह मोड़ है जो मेरे ग्राहकों को उनकी खरीदारी की गाड़ियाँ ढीली कर देता है।
वार्निश के लिए यह सामान्य व्यवहार है या दोष देने के लिए मेरा वीसीएल है? ऐसा लगेगा कि इसका नहीं
आगे की जानकारी।
आगे की जांच करने पर, ऐसा प्रतीत होता है कि यह समस्या GitHub पर अंक # 725 से संबंधित है।
मेरी Magento की स्थापना 1.9.1.0 संस्करण है। यह भी कहा जाना चाहिए कि मेरा पूरा सीमांत https के तहत चलाया जा रहा है। एसएसएल को समाप्त करने के लिए मैं वार्निश के सामने पाउंड का उपयोग कर रहा हूं।
ऐसा प्रतीत होता है कि इस संस्करण में डिफ़ॉल्ट मैगेंटो व्यवहार एक माध्यमिक फ्रंटएंड कुकी बनाने के लिए है, जिसे आमतौर पर 'फ्रंटेंड_सीड' कहा जाता है, एमआईटीएम हमलों के खिलाफ परीक्षण करने के प्रयास में।
ऐसा लगता है कि टर्पेन्टाइन द्वारा उत्पन्न वीसीएल फ़ाइल इस कुकी पर पारित नहीं हो रही है, जिससे अमान्य सत्र हो रहे हैं।
क्या कोई समझा सकता है कि कैसे VCL फ़ाइल उन कुकीज़ पर गुजरती है जो Magento क्लाइंट को बनाती है?
मैंने इसे आवश्यक कुकीज़ उत्पन्न नहीं करने के लिए वार्निश तक सीमित कर दिया है।
Magento 1.9.1.0 के रूप में, MITM हमलों को रोकने के लिए एक 'फ्रंटेंड_सीड' कुकी पेश की गई थी।
यह Mage_Core_Model_Session_Abstract_Varien
लाइन 135 की कक्षा में पाया जा सकता है
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);
}
}
ग्राहकों के लिए सुरक्षित कनेक्शन प्रदान करने के लिए, वार्निश को एक 'फ्रंटएंड' कुकी बनानी होगी, जिसे बाद में Magento उस विशेष ग्राहक की पहचान करने के लिए उपयोग करेगा। अब तक, यह ऐसा करना ठीक प्रतीत होता है। हालाँकि, यह Magento 1.9.1.0 जैसा दिखता है, इसे अब 'फ्रंटेंड_सीड' कुकी भी जेनरेट करना होगा।
वार्निश को ऐसा करना पड़ता है, क्योंकि प्रतिक्रिया को कैशिंग करके, यह प्रतिक्रिया हेडर को भी कैश करता है, जिसमें 'फ्रंटेंड' कुकीज़ शामिल हैं।
इसलिए, डिफ़ॉल्ट रूप से, वार्निश किसी भी कुकीज़ को विस्फोट कर देता है जो बैकएंड तब प्रतिक्रिया करता है जब इसकी हैंडलिंग 'लुकअप' या 'पास' की स्थिति होती है। यह एक ही कैश्ड फ्रंटेंड कुकी के साथ जारी किए जा रहे कई उपयोगकर्ताओं को रोकने के लिए करता है (जो लोगों के सत्रों से समझौता करेगा)।
किसी भी समय वार्निश 'पाइप' के साथ अनुरोध को संभालता है, मैगेंटो आवश्यक कुकीज़ बनाने और उन्हें उपयोगकर्ता ब्राउज़र में संलग्न करने में सक्षम है। यह प्रणाली प्रारंभिक सत्यापन को विफल कर रही है, लेकिन फिर उपयोगकर्ता को एक नया सत्र प्रदान करती है। यह लक्षण कार्ट की हानि या शॉपिंग कार्ट में उत्पादों को जोड़ने में असमर्थता के रूप में प्रकट होता है।
तारपीन VCL vcl_recv
फ़ंक्शन में इस कोड द्वारा देखे गए विधि प्रकार GET या HEAD का कोई भी अनुरोध 'पाइप' करेगा :
// 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);
}
इसलिए, लक्षण सबसे अधिक ध्यान देने योग्य होता है जब उपयोगकर्ता अपनी गाड़ी में एक आइटम जोड़ने का प्रयास करता है, या पहली बार चेकआउट करने का प्रयास करता है।
कैसे ठीक करना है?
मेरा मानना है कि इस मुद्दे का हल तारपीन का VCL है जो आने वाले आगंतुकों के लिए एक 'फ्रंटएंड_सीड' कुकी भी बनाता है, और फिर तारपीन मॉड्यूल को उस कुकी को वर्तमान सत्र में जोड़ देता है, जैसा कि अब 'फ्रंटएंड' कुकी के लिए है।
तो ... हम इसे कैसे लागू करते हैं?
कैविएट: मैं गलत हो सकता हूं, मैं वार्निश के लिए बहुत नया हूं, लेकिन मैंने अभी इस पर बहुत घंटे बिताए हैं और यही मैं देख रहा हूं, अभी जो भी समर्थन करता है वह बहुत सराहा जाएगा।
अंतिम अद्यतन और मेरी राशि का फिक्स - 2015 10 30
वार्निश में 'फ्रंटेंड_सीड' कुकी बनाना असंभव है क्योंकि कुकी को मैजेंटो द्वारा सर्वर पर यादृच्छिक रूप से बनाया जाता है और ग्राहकों के सत्र में एमडी 5 हैश के रूप में संग्रहीत किया जाता है। यह आपको ग्राहक सत्र के बाहर बाहरी रूप से बनाने से रोकता है।
इस मुद्दे पर मैं जिस समाधान के साथ आया था, उसका सबसे अच्छा समाधान यह है कि मैगेंटो जिस तरह से ग्राहक सत्रों को संभालता है, उसे अलग कर दे।
वर्तमान में Magento इस तरह से अमान्य सत्रों को संभालता है:
IF
The requested session by the customer is flagged as invalid
THEN
Stop processing request
Redirect to the appropriate page
मेरा नया तर्क निम्नानुसार है:
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
मेरा नया दृष्टिकोण ग्राहकों की प्रतिक्रिया को संभालने की अनुमति देता है, यहां तक कि पहली यात्रा पर भी। यह नहीं है कि तारपीन के नवीनतम कार्यान्वयन कैसे काम करते हैं।
मेरा मुद्दा, अंक # 829 - / गठजोड़ / पत्रिका-तारपीन / मुद्दे / 829 GitHub पर। मेरी वीसीएल की एक प्रति यहां मिल सकती है।
GitHub पर मेरा मुद्दा बंद कर दिया गया है क्योंकि यह यहां पाई गई एक बहुत पुरानी समस्या का एक डुप्लिकेट है: