Die Antwort auf einen Artikel in SitePoint ist nicht vollständig. Bitte beachten Sie RFC 6265 (um fair zu sein, dieser RFC wurde 2011 veröffentlicht, nachdem diese Frage gestellt wurde, die den vorherigen RFC 2965 aus dem Jahr 2000 und den RFC 2109 aus dem Jahr 1997 ersetzt).
In Abschnitt 5.4 , Unterabschnitt 2 heißt es:
Der Benutzeragent sollte die Cookie-Liste in der folgenden Reihenfolge sortieren:
- Cookies mit längeren Pfaden werden vor Cookies mit kürzeren Pfaden aufgelistet.
HINWEIS: Nicht alle Benutzeragenten sortieren die Cookie-Liste in dieser Reihenfolge, aber diese Reihenfolge spiegelt die gängige Praxis wider, als dieses Dokument geschrieben wurde, und in der Vergangenheit gab es Server, die (fälschlicherweise) von dieser Reihenfolge abhingen.
Es gibt auch dieses kleine Juwel in Abschnitt 4.2.2 :
... Server sollten sich NICHT auf die Serialisierungsreihenfolge verlassen. Insbesondere wenn der Cookie-Header zwei Cookies mit demselben Namen enthält (z. B. die mit unterschiedlichen Pfad- oder Domänenattributen festgelegt wurden), sollten sich Server NICHT auf die Reihenfolge verlassen, in der diese Cookies im Header angezeigt werden.
Beachten Sie in Ihrem Beispiel-Anforderungscookie ( Cookie: a = 2; a = 1 ), dass das mit dem Pfad / Beispiel ( a = 2 ) gesetzte Cookie einen längeren Pfad hat als das mit dem Pfad / ( a = 1 ) wird zuerst in der Zeile an Sie zurückgeschickt, was der Empfehlung der Spezifikation entspricht. Sie gehen also mehr oder weniger richtig davon aus, dass Sie den ersten Wert auswählen könnten .
Leider ist die in RFCs verwendete Sprache äußerst spezifisch - die Verwendung der Wörter SOLLTE und SOLLTE NICHT zu Mehrdeutigkeiten in RFCs führen. Diese zeigen an Konventionen, sollte beachtet werden, sind aber nicht erforderlich , um die Spezifikation sein konformen. Obwohl ich den RFC dafür recht gut verstehe, habe ich nicht nachgeforscht, was Kunden in der realen Welt tun. Es ist möglich, dass ein oder mehrere Browser oder andere Software, die als HTTP-Clients fungieren, das Cookie mit dem längsten Pfad (z. B. / Beispiel ) nicht zuerst im Cookie: -Header senden .
Wenn Sie in der Lage sind, den Wert des Cookies zu kontrollieren und Ihre Lösung kinderleicht machen möchten, sind Sie entweder am besten dran:
Verwenden eines anderen Cookie-Namens zum Überschreiben bestimmter Pfade, z.
- Set-Cookie: a-global = 1; Pfad = /; Version = 1
- Set-Cookie: a-Beispiel = 2; Pfad = / Beispiel; Version = 1
Speichern Sie den gewünschten Pfad im Cookie-Wert selbst:
- Set-Cookie: a = 1 & path = /; Path = /; Version = 1
- Set-Cookie: a = 2 & Pfad = / Beispiel; Pfad = / Beispiel; Version = 1
Für beide Problemumgehungen ist zusätzliche Logik auf dem Server erforderlich, um den gewünschten Cookie-Wert auszuwählen, indem die angeforderte URL mit der Liste der verfügbaren Cookies verglichen wird. Es ist nicht zu hübsch. Es ist bedauerlich , der RFC nicht die Weitsicht hat zu verlangen , dass ein längerer Weg vollständig ein Cookie mit einem kürzeren Pfad überschreibt (zB: in Ihrem Beispiel, würden Sie erhalten Cookie: a = 2 nur ).