SitePointの記事を参照する答えは完全ではありません。参照してくださいRFC 6265を(この質問は以前より優先され、投稿された後に公平であるために、このRFCは2011年にリリースされたRFC 2965を2000からRFC 2109 1997から)。
セクション5.4、サブセクション2には、次のように書かれています。
ユーザーエージェントは、Cookieリストを次の順序で並べ替える必要があります。
- パスが長いCookieは、パスが短いCookieの前に一覧表示されます。
注:すべてのユーザーエージェントがCookieリストをこの順序で並べ替えるわけではありませんが、この順序は、このドキュメントが作成されたときの一般的な慣行を反映しており、歴史的に、この順序に(誤って)依存していたサーバーがありました。
セクション4.2.2にもこの小さな宝石があります:
...サーバーはシリアル化の順序に依存すべきではありません。特に、Cookieヘッダーに同じ名前の2つのCookieが含まれている場合(たとえば、異なるパスまたはドメイン属性で設定されている場合)、サーバーはこれらのCookieがヘッダーに表示される順序に依存しないでください。
リクエストCookieの例(Cookie:a = 2; a = 1)では、パス/ example(a = 2)で設定されたCookieは、パス/(a = 1)で設定されたCookieよりも長いパスを持っていることに注意してください。仕様の推奨事項と一致する最初の行で返送されます。したがって、最初の値を選択できるという仮定は多かれ少なかれ正しいです。
残念ながら、RFCで使用される言語は非常に具体的です。「SHOULD」および「SHOULDNOT」という単語を使用すると、RFCにあいまいさが生じます。これらは、従う必要のある規則を示していますが、仕様に準拠している必要はありません。私はこれに関するRFCをよく理解していますが、実際のクライアントが何をしているのかを調べるための調査は行っていません。HTTPクライアントとして機能する1つ以上のブラウザまたは他のソフトウェアが、Cookie:ヘッダーの最初に最長パスのCookie(例:/ example)を送信しない可能性があります。
Cookieの値を制御する立場にあり、ソリューションを確実なものにしたい場合は、次のいずれかを実行するのが最善です。
次のような特定のパスでオーバーライドするために別のCookie名を使用する。
- Set-cookie:a-global = 1; Path = /; Version = 1
- Set-cookie:a-example = 2; Path = / example; Version = 1
必要なパスをCookie値自体に保存します。
- Set-cookie:a = 1&path = /; Path = /; Version = 1
- Set-cookie:a = 2&path = / example; Path = / example; Version = 1
これらの回避策はどちらも、要求されたURLを使用可能なCookieのリストと比較することにより、サーバー上で目的のCookie値を選択するための追加のロジックを必要とします。あまりきれいではありません。残念ながら、RFCには、長いパスが短いパスのCookieを完全にオーバーライドすることを要求する先見性がありませんでした(たとえば、この例では、Cookie:a = 2 のみを受け取ります)。