सबडोमेन में लोकलस्टोरेज का उपयोग करें


95

मैं उन ब्राउज़र पर लोकलस्टोरेज के साथ कुकीज़ की जगह ले रहा हूं जो इसे (किसी को भी) IE का समर्थन कर सकते हैं। समस्या साइट.कॉम और www हैsite.com अपनी अलग लोकलस्टोरेज ऑब्जेक्ट्स को स्टोर करता है। मेरा मानना ​​है कि www को एक उपडोमेन माना जाता है (यदि आप मुझसे पूछें तो एक बेवकूफ निर्णय)। यदि कोई उपयोगकर्ता मूल रूप से site.com पर था और www में टाइप करने का फैसला करता है । site.com उसकी अगली यात्रा पर, उसके सभी व्यक्तिगत डेटा अप्राप्य होंगे। मुख्य डोमेन के समान लोकलस्टोरेज को साझा करने के लिए मुझे अपने सभी "उप डोमेन" कैसे प्राप्त होंगे?


4
फ़ायरफ़ॉक्स और IE8 उपयोगकर्ता निर्दिष्ट डोमेन के तहत लगातार डेटा संग्रहीत करने का समर्थन करते हैं। FF पर उदाहरण के लिए, आप GlobalStorage ['site.com'] कर सकते हैं और यह www.site.com और site.com के लिए स्वीकार्य होगा। मुझे अभी भी पता नहीं चला है कि क्रोम के कार्यान्वयन में यह कैसे करना है।
जोजो

9
एक या बाद वाले का उपयोग करने पर विचार करें - www के साथ आने वाले सभी उपयोगकर्ताओं को पुनर्निर्देशित करें। उप-डोमेन के लिए उप-डोमेन, या आसपास का दूसरा तरीका।
इलाद नवा

मैंने बहुत पहले लेख बनाया है:
जेकुबिक

जवाबों:


94

यह है कि मैं इसे डोमेन में कैसे उपयोग करता हूं ...

  • अपने मूल डोमेन से एक iframe का उपयोग करें - parent.com कहें
  • फिर प्रत्येक child.com डोमेन पर, बस अपने parent.com iframe पर एक पोस्टमैसेज करें
  • आपको बस यह करने की आवश्यकता है कि अपने पोस्टमैसेज संदेशों की व्याख्या कैसे करें।

मुझे उम्मीद है यह मदद करेगा :)


2
यह वास्तविक उत्तर है, चेक बंद नहीं। मैंने इसे स्वयं किया है, लेकिन पोस्टमेसेज के साथ एक सुविधाजनक कॉलबैक आवरण भी बनाया है।
जेसन सेब्रिंग

4
इस विधि को समझाने वाले कुछ उदाहरण कोड के साथ एक अच्छा लेख यहां दिया गया है: jcubic.wordpress.com/2014/06/20/cross-domain-localstorage
टोड मूल्य

4
ध्यान दें कि यह केवल तभी संभव है जब तृतीय-पक्ष कुकी अक्षम न हों: stackoverflow.com/a/44097269/4311428
अधिकतम

6
Apple ने 3 पार्टी डेटा को ब्लॉक करने के लिए डेस्कटॉप और मोबाइल दोनों पर सफारी 7+ पर चूक को अपडेट किया है। विकल्प को अब "ब्लॉक कुकीज़ और अन्य वेबसाइट डेटा" कहा जाता है, जो स्थानीयस्टोर जैसी चीजों को संदर्भित करता है जो अब डोमेन द्वारा पूरी तरह से पृथक हैं। यह विधि सफारी में काम नहीं
करेगी

2
@ मोम @ अरंगनाथन यह अभी भी मूल प्रश्न मामले के लिए काम करता है - site.com/ www.site.comजब तक उप डोमेन एक ही मूल डोमेन पर हैं
Kostiantyn

40

यदि आप इस विशेष समस्या के लिए iframe और postMessage समाधान का उपयोग कर रहे हैं, तो मुझे लगता है कि यह सबडोमेन-कम कुकी में डेटा संग्रहीत करने के लिए कम काम (कोड-वार और गणना-वार दोनों) हो सकता है , और यदि यह पहले से ही नहीं है लोकलस्टोरेज में लोड होने पर, इसे कुकी से पकड़ें

पेशेवरों:

  • अतिरिक्त आईफ्रेम और पोस्टमेज की आवश्यकता नहीं है।

विपक्ष:

  • डेटा को सभी उप-डोमेन (केवल www) में उपलब्ध कराएगा, यदि आप सभी उप-डोमेन पर भरोसा नहीं करते हैं तो यह आपके लिए काम नहीं कर सकता है।
  • प्रत्येक अनुरोध पर सर्वर को डेटा भेजेंगे। महान नहीं है, लेकिन आपके परिदृश्य पर निर्भर करता है, शायद अभी भी iframe / postMessage समाधान की तुलना में कम काम करता है।
  • यदि आप ऐसा कर रहे हैं, तो सीधे कुकीज़ का उपयोग क्यों न करें? आपके संदर्भ पर निर्भर करता है।
  • डोमेन के लिए सभी कुकीज़ के पार कुल 4K अधिकतम कुकी आकार, (टिप्पणियों में इसे इंगित करने के लिए ब्लेक के लिए धन्यवाद)

मैं अन्य टिप्पणीकारों से सहमत हूं, हालांकि, ऐसा लगता है कि यह स्थानीय स्तर के लिए एक विशिष्ट विकल्प होना चाहिए, ताकि काम के आसपास की आवश्यकता न हो।


29
Con: 4k अधिकतम कुकी आकार
ब्लेक मिलर

17
इसके अलावा, जैसा कि मैंने कठिन तरीका सीखा है, 4k सीमा किसी भी डोमेन के लिए सभी कुकीज़ के आकार के योग के लिए है, किसी कुकी के लिए नहीं।
ब्लेक मिलर

अन्य विपक्ष: - कुकीज़ की संभावना एडब्लॉकर्स द्वारा अवरुद्ध कर दी जाएगी - कुकीज़ का उपयोग छोटे डेटा बिट्रॉइन सर्वर और क्लाइंट को साझा करने के लिए किया जाता है, यदि सर्वर कुकी में आपके द्वारा संग्रहीत डेटा का उपयोग नहीं कर रहा है, तो इसके परिणामस्वरूप एक दुरुपयोग है
Enn

32

मेरा सुझाव है कि site.com को www.site.com पर दोनों स्थिरता और इस तरह के मुद्दों से बचने के लिए पुनर्निर्देशित करें।

इसके अलावा, PersistJS जैसे क्रॉस-ब्राउज़र समाधान का उपयोग करने पर विचार करें जो प्रत्येक ब्राउज़र के मूल भंडारण का उपयोग कर सकता है।


मेरे पास इस तरह के रीडायरेक्ट करने के लिए सर्वर तक पहुंच नहीं है। क्या वह लाइब्रेरी मुझे www और गैर-www के बीच लगातार डेटा साझा करने की अनुमति देती है? कुछ पढ़ने के बाद, ऐसा लगता है कि लगभग सभी ब्राउज़रों के भंडारण तंत्र इसकी अनुमति नहीं देते हैं। कोई फर्क नहीं पड़ता कि यह कुकीज़ या लोकलस्टोरेज है, हम इस समस्या में भाग लेने जा रहे हैं ...
जोजो

हां, भंडारण आमतौर पर उप डोमेन सहित डोमेन पर निर्भर है। यही कारण है कि मैंने एक रीडायरेक्ट का सुझाव दिया। जरूरी नहीं कि आपको व्यवस्थापक पहुंच की आवश्यकता हो, बस दस्तावेज़ रूट में एक .htaccess नियम का उपयोग करें
Eran Galperin

1
@JoJo रीडायरेक्ट करने के कई तरीके हैं, जैसे हेडर भेजकर Location, या <meta>HTML टैग के माध्यम से , या यहाँ तक कि JS के माध्यम से window.location
सोनी सैंटोस

1
यह सिर्फ जवाब देने से बच रहा है। मयंक के जवाब को सही देखें।
जेसन सेब्रिंग

1
+1 @avoiding, प्लस यह अन्य मामलों के लिए अप्रासंगिक है - जैसे कि जिसके लिए मैं यहाँ हूँ lang1.domain.com - lang2.domain.com
r --------- k

5

मुख्य डोमेन में कुकी पर सेट करें -

document.cookie = "key=value;domain=.mydomain.com"

और फिर किसी भी मुख्य डोमेन या उप डोमेन से डेटा ले लो और इसे लोकलस्टोरेज पर सेट करें


4

मैं xdLocalStorage का उपयोग कर रहा हूं, यह एक लाइट जेएस लाइब्रेरी है जो आइफ्रेम पोस्ट संदेश संचार का उपयोग करके लोकलस्टोरेज इंटरफेस को लागू करता है और क्रॉस डोमेन स्टोरेज को सपोर्ट करता है। (कोणीयजेएस सपोर्ट)

https://github.com/ofirdagan/cross-domain-local-storage


3
मैंने इसे देखा, लेकिन ऐसा लगता है कि यह सफारी पर काम नहीं करता है। github.com/ofirdagan/cross-domain-local-storage/issues/10
Andris Zalitis

1

इस तरह का समाधान इस तरह की कई समस्याओं का कारण बनता है। मुख्य डोमेन पर रीडायरेक्ट और एसईओ विचारों के लिए सबसे अच्छा समाधान है।

इसे सर्वर स्तर पर पुनर्निर्देशित करें

Nginx के साथ गैर-www में www को पुनर्निर्देशित कैसे करें

https://www.digitalocean.com/community/tutorials/how-to-redirect-www-to-non-www-with-nginx-on-centos-7

या मार्ग 53 जैसे कोई अन्य स्तर यदि उपयोग कर रहे हैं


0

इसे मैंने अपनी वेबसाइट के लिए हल किया है। मैंने www के बिना www.site.com के सभी पृष्ठों को पुनर्निर्देशित किया। इस तरह, यह हमेशा www.site.com का स्थानीय स्तर लेगा

रूट निर्देशिका में निम्नलिखित को अपने .htacess में जोड़ें , (यदि आपके पास पहले से नहीं है तो एक बनाएं)

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

5
मैं इसे कम करने के लिए बहुत ललचा रहा हूं, लेकिन मैं ऐसा नहीं करूंगा क्योंकि यह ओपी के उपयोग के मामले में मदद कर सकता है, लेकिन ऐसे लोग जो myapp.com और Developers.myapp.com और support.myapp.com पर सत्र रखना चाहते हैं, उनके लिए यह उत्तर है अच्छा नही।
डॉन ओमोंडी

अगर आप सुझाव दे रहे हैं, तो आप लिंक के साथ मेरी मदद कर सकते हैं, अगर मैं @DonOmondi की सराहना करता हूँ!
आयुष बाहेती

3
ओपी ने पूछा "सबडोमेन में लोकलस्टोरेज का उपयोग करें" आपका उत्तर "नॉन-www को रीडायरेक्ट www" है बहुत अलग चीजें हैं लेकिन यह काम कर सकता है यदि और केवल तभी विशिष्ट उपडोमेन "www.abc.com" सामान्य मामलों के लिए यहां कुछ अन्य उत्तर हैं। और अधिक व्यावहारिक।
डॉन ओमोंडी

0

इस तरह से:

किसी दिए गए सुपरडोमेन (जैसे example.com) के उप-डोमेन के बीच साझा करने के लिए, एक ऐसी तकनीक है जिसका उपयोग आप उस स्थिति में कर सकते हैं। यह करने के लिए लागू किया जा सकता localStorage, IndexedDB, SharedWorker, BroadcastChannel, आदि, जो सभी एक ही मूल के पन्नों के बीच साझा कार्यक्षमता प्रदान करते हैं, लेकिन किसी कारण से करने के लिए किसी भी संशोधन का सम्मान नहीं करते document.domainकि उन्हें सीधे अपने मूल रूप में superdomain का उपयोग करते हैं जाएगा।

(1) डेटा के लिए एक "मुख्य" डोमेन चुनें: यानी या तो https://example.com या https://www.example.com आपके लोकलस्टोरेज डेटा को रखेगा। आइए आपको बताते हैं https://example.com

(2) उस चुने हुए डोमेन के पन्नों के लिए सामान्य रूप से लोकलस्टोरेज का उपयोग करें।

(3) सभी https://www.example.com पृष्ठों ( अन्य डोमेन) पर, जावास्क्रिप्ट को सेट करने के लिए उपयोग करें document.domain = "example.com";। फिर एक छिपा हुआ भी बनाएं <iframe>, और इसे चुने हुए https://example.com डोमेन के किसी पृष्ठ पर नेविगेट करें ( यह कोई फर्क नहीं पड़ता कि कौन सा पृष्ठ है , जब तक आप वहां पर जावास्क्रिप्ट का बहुत कम स्निपेट डाल सकते हैं। यदि आप ' साइट बनाने के लिए, बस इस उद्देश्य के लिए विशेष रूप से एक खाली पृष्ठ बनाएं। यदि आप एक एक्सटेंशन या एक Greasemonkey- शैली उपयोगकर्ता नाम लिख रहे हैं और उदाहरण के लिए पृष्ठों पर कोई नियंत्रण नहीं है।सर्वर, सबसे हल्का पृष्ठ चुनें जिसे आप पा सकते हैं और उसमें अपनी स्क्रिप्ट डाल सकते हैं। किसी प्रकार का "नहीं मिला" पृष्ठ शायद ठीक होगा)।

(4) छिपे हुए iframe पेज पर स्क्रिप्ट को केवल (ए) सेट की आवश्यकता होती है document.domain = "example.com";, और (बी) ऐसा होने पर मूल विंडो को सूचित करें। उसके बाद, पेरेंट विंडो iframe विंडो और उसके सभी ऑब्जेक्ट्स को बिना किसी प्रतिबंध के एक्सेस कर सकती है! तो न्यूनतम iframe पेज कुछ इस तरह है:

<!doctype html>
<html>
<head>
  <script>
    document.domain = "example.com";
    window.parent.iframeReady();  // function defined & called on parent window
  </script>
</head>
<body></body>
</html>

यदि कोई उपयोगकर्ता-पत्र लिख रहा है, तो आप बाह्य-सुलभ कार्यों iframeReady()को अपने साथ जोड़ना नहीं चाह सकते हैं unsafeWindow, इसलिए मुख्य विंडो उपयोगकर्ता-सूचना को सूचित करने का एक बेहतर तरीका एक कस्टम घटना का उपयोग करना हो सकता है:

    window.parent.dispatchEvent(new CustomEvent("iframeReady"));

जिसे आप अपने मुख्य पृष्ठ की विंडो में कस्टम "iframeReady" ईवेंट के लिए श्रोता जोड़कर पता लगाएंगे।

(नोट: आपको iframe का डोमेन पहले से example.com है, तब भी आपको document.domain = "example.com" सेट करने की आवश्यकता है: document.domain के लिए मान निर्दिष्ट करना मूल रूप से मूल पोर्ट को शून्य करने के लिए सेट करता है , और दोनों पोर्ट iframe के लिए मेल खाना चाहिए और इसके मूल को समान माना जाता है। यहां देखें नोट: https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#Changing_origin )

(5) एक बार छिपा iframe अपनी मूल विंडो इसके तैयार होते ही सूचित किया है, माता पिता के विंडो में स्क्रिप्ट अभी उपयोग कर सकते हैं iframe.contentWindow.localStorage, iframe.contentWindow.indexedDB, iframe.contentWindow.BroadcastChannel, iframe.contentWindow.SharedWorkerबजाय window.localStorage, window.indexedDBआदि ... और इन सभी वस्तुओं के दायरे वाला हो जाएगा चुना https: // example.com मूल - तो वे आपके सभी पृष्ठों के लिए समान साझा मूल होंगे!

इस तकनीक का सबसे अजीब हिस्सा यह है कि आपको आगे बढ़ने से पहले आईफ्रेम को लोड करने के लिए इंतजार करना होगा। इसलिए आप उदाहरण के लिए, अपने DOMContentLoaded हैंडलर में स्थानीय रूप से उपयोग करना शुरू नहीं कर सकते। यह भी पता लगाने के लिए आप कुछ त्रुटि हैंडलिंग जोड़ना चाह सकते हैं कि क्या छिपा हुआ iframe सही तरीके से लोड करने में विफल रहता है।

जाहिर है, आपको यह भी सुनिश्चित करना चाहिए कि आपके पेज के जीवनकाल के दौरान छिपे हुए आइफ्रेम को हटाया या नेविगेट नहीं किया गया है ... ओटोह मुझे नहीं पता कि इसका परिणाम क्या होगा, लेकिन बहुत संभावना है कि खराब चीजें होंगी।

और, एक चेतावनी: सेटिंग / बदलना हेडर का उपयोग करके अवरुद्धdocument.domain किया जा सकता है , जिस स्थिति में यह तकनीक वर्णित के रूप में उपयोग करने योग्य नहीं होगी।Feature-Policy


हालाँकि, इस तकनीक का एक बहुत अधिक जटिल सामान्यीकरण है, जिसे अवरुद्ध नहीं किया जा सकता है Feature-Policy, और यह पूरी तरह से असंबंधित डोमेन को डेटा, संचार, और साझा किए गए श्रमिकों को साझा करने की अनुमति देता है (अर्थात एक सामान्य सुपरडोमेन बंद नहीं करता है)। @ मयंक जैन ने पहले ही अपने उत्तर में इसका वर्णन कर दिया, अर्थात्:

सामान्य विचार यह है कि, ऊपर के रूप में, आप पहुंच के लिए सही मूल प्रदान करने के लिए एक छिपा हुआ आइफ्रेम बनाते हैं; लेकिन इसके बजाय बस सीधे iframe विंडो के गुणों को हथियाने के लिए, आप सभी काम करने के लिए iframe के अंदर स्क्रिप्ट का उपयोग करते हैं, और आप iframe और आपके मुख्य विंडो के बीच केवल उपयोग करने postMessage()और के बीच संवाद करते हैं addEventListener("message",...)

यह काम करता है क्योंकि postMessage()विभिन्न-मूल खिड़कियों के बीच भी इस्तेमाल किया जा सकता है। लेकिन यह काफी अधिक जटिल है क्योंकि आपको कुछ प्रकार के मैसेजिंग इन्फ्रास्ट्रक्चर के माध्यम से सब कुछ पास करना पड़ता है जो कि आप अपने मुख्य विंडो के कोड में सीधे लोकलस्टोरेज, इंडेक्सडीडीबी, आदि एपीआई का उपयोग करने के बजाय, आइफ्रेम और मुख्य विंडो के बीच बनाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.