Verwenden Sie localStorage für alle Subdomains

95

Ich ersetze Cookies durch localStorage in Browsern, die dies unterstützen können (außer IE). Das Problem ist site.com und www . site.com speichert ihre eigenen separaten localStorage-Objekte. Ich glaube, www wird als Subdomain angesehen (eine dumme Entscheidung, wenn Sie mich fragen). Wenn ein Benutzer ursprünglich auf site.com war und sich entscheidet, www einzugeben . Bei ihrem nächsten Besuch auf site.com sind alle ihre persönlichen Daten nicht zugänglich. Wie kann ich erreichen, dass alle meine "Subdomains" denselben localStorage wie die Hauptdomain verwenden?

JoJo
quelle
4
Firefox und IE8 unterstützen das Speichern persistenter Daten unter einer benutzerdefinierten Domäne. Bei FF können Sie beispielsweise globalStorage ['site.com'] ausführen. Dies ist für www.site.com und site.com möglich. Ich habe immer noch nicht herausgefunden, wie dies in der Chrome-Implementierung zu tun ist.
JoJo
9
Erwägen Sie die Verwendung eines oder des letzteren - leiten Sie alle Benutzer um, die das Internet besuchen. Subdomain zur Subdomain-freien Domain oder umgekehrt.
Elad Nava
Ich habe vor langer Zeit einen Artikel erstellt: Domainübergreifender LocalStorage
jcubic

Antworten:

93

So verwende ich es domänenübergreifend ...

  • Verwenden Sie einen Iframe aus Ihrer übergeordneten Domain - sagen Sie parent.com
  • Führen Sie dann auf jeder child.com-Domain einfach eine postMessage an Ihren parent.com-Iframe durch
  • Sie müssen lediglich ein Protokoll zur Interpretation Ihrer postMessage-Nachrichten einrichten, um mit dem iframe von parent.com zu kommunizieren.

Ich hoffe, es hilft :)

Mayank Jain
quelle
2
Dies ist die eigentliche Antwort, nicht die abgehakt. Ich habe dies selbst gemacht, aber auch einen praktischen Callback-Wrapper mit postMessage erstellt.
Jason Sebring
4
Hier ist ein guter Artikel mit einem Beispielcode, der diese Methode erklärt: jcubic.wordpress.com/2014/06/20/cross-domain-localstorage
Todd Price
4
Beachten Sie, dass dies nur möglich ist, wenn Cookies von Drittanbietern nicht deaktiviert sind: stackoverflow.com/a/44097269/4311428
Max
6
Apple hat die Standardeinstellungen für Safari 7+ sowohl auf dem Desktop als auch auf dem Handy aktualisiert, um Daten von Drittanbietern zu blockieren. Die Option heißt jetzt "Cookies und andere Website-Daten blockieren" und bezieht sich auf Dinge wie localstorage, die jetzt vollständig von der Domain isoliert sind. Diese Methode funktioniert nicht in Safari
Aranganathan
2
@Max @Aranganathan es funktioniert immer noch für den ursprünglichen Fragenfall - site.com/ www.site.comsolange sich Subdomains auf derselben übergeordneten Domain befinden
Kostiantyn
39

Wenn Sie die iframe- und postMessage-Lösung nur für dieses spezielle Problem verwenden, ist es möglicherweise weniger aufwendig (sowohl in Bezug auf den Code als auch in Bezug auf die Berechnung), die Daten nur in einem Cookie ohne Subdomain zu speichern, und falls dies noch nicht geschehen ist Nehmen Sie es in localStorage beim Laden aus dem Cookie .

Vorteile:

  • Benötigt keine zusätzliche Einrichtung von iframe und postMessage.

Nachteile:

  • Stellt die Daten für alle Subdomains zur Verfügung (nicht nur für www). Wenn Sie also nicht allen Subdomains vertrauen, funktioniert dies möglicherweise nicht für Sie.
  • Sendet die Daten bei jeder Anforderung an den Server. Nicht großartig, aber abhängig von Ihrem Szenario möglicherweise immer noch weniger Arbeit als die iframe / postMessage-Lösung.
  • Wenn Sie dies tun, warum nicht einfach die Cookies direkt verwenden? Kommt auf deinen Kontext an.
  • Maximale Cookie-Größe von 4 KB, insgesamt über alle Cookies für die Domain hinweg (Dank an Blake für den Hinweis in den Kommentaren)

Ich stimme jedoch anderen Kommentatoren zu. Dies scheint eine spezifizierbare Option für localStorage zu sein, sodass keine Umgehungen erforderlich sind.

Matt
quelle
29
Con: 4k maximale Cookie-Größe
Blake Miller
17
Wie ich auf die harte Tour gelernt habe, gilt das 4k-Limit für die Summe der Größen aller Cookies für eine einzelne Domain, nicht für jedes Cookie.
Blake Miller
andere Nachteile: - Cookies werden mit größerer Wahrscheinlichkeit von Adblockern blockiert. - Cookies sollen dazu verwendet werden, kleine Daten zwischen Server und Client auszutauschen. Wenn der Server die im Cookie gespeicherten Daten nicht verwendet, ist dies folglich ein Missbrauch.
Enno
32

Ich empfehle, site.com aus Gründen der Konsistenz und zur Vermeidung solcher Probleme auf www.site.com umzuleiten.

Erwägen Sie außerdem die Verwendung einer browserübergreifenden Lösung wie PersistJS , die jeden nativen Browser-Speicher verwenden kann.

Eran Galperin
quelle
Ich habe keinen Administratorzugriff auf die Server, um eine solche Umleitung durchzuführen. Kann ich mit dieser Bibliothek persistente Daten zwischen www und nicht www austauschen? Nach einigem Lesen scheinen es fast alle Speichermechanismen der Browser nicht zuzulassen. Egal ob es sich um Cookies oder localStorage handelt, wir werden auf dieses Problem stoßen ...
JoJo
Ja, der Speicher hängt normalerweise von der Domäne ab, einschließlich der Unterdomäne. Aus diesem Grund habe ich eine Weiterleitung vorgeschlagen. Sie benötigen nicht unbedingt Administratorzugriff, verwenden Sie einfach eine .htaccess-Regel im Dokumentenstamm
Eran Galperin
1
@JoJo Es gibt verschiedene Möglichkeiten zum Umleiten, z. B. durch Senden des Headers Location, des <meta>HTML-Tags oder sogar von JS über window.location.
Sony Santos
1
Dies vermeidet nur die Antwort. Siehe Mayanks Antwort als richtig.
Jason Sebring
1
+1 @avoiding, plus dies ist für andere Fälle irrelevant - wie der, für den ich hier bin lang1.domain.com - lang2.domain.com
r --------- k
5

In der Hauptdomäne auf Cookie setzen -

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

Nehmen Sie dann die Daten aus einer beliebigen Haupt- oder Unterdomäne und legen Sie sie im localStorage fest

URL87
quelle
0

So habe ich es für meine Website gelöst. Ich habe alle Seiten ohne www auf www.site.com umgeleitet. Auf diese Weise wird immer der lokale Speicher von www.site.com benötigt

Fügen Sie Folgendes zu Ihrer .htacess hinzu (erstellen Sie eine, falls Sie sie noch nicht haben) im Stammverzeichnis

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Ayush Baheti
quelle
5
Ich bin sehr versucht, dies abzulehnen, aber ich werde es nicht tun, weil es dem Anwendungsfall des OP helfen kann, aber für Leute, die Sitzungen über myapp.com und developer.myapp.com und support.myapp.com hinweg führen möchten, lautet diese Antwort nicht gut.
Don Omondi
hey @DonOmondi Ich würde mich freuen, wenn Sie mir mit den Links für das, was Sie vorschlagen, helfen können!
Ayush Baheti
3
Das OP fragte "Verwenden Sie localStorage über Subdomains hinweg". Ihre Antwort lautet "www zu Nicht-www umleiten", aber es kann genau dann funktionieren, wenn die spezifische Subdomain "www.abc.com" ist. In allgemeinen Fällen gibt es hier einige andere Antworten praktischer.
Don Omondi