1

私は 2 つの「ドメイン」にまたがってローカルで作業しています。マシンに enterprise.local および application.local 仮想ホストがあり、「local」または「.local」のドメイン Cookie を設定する必要がありますが、Cookie を適切に設定するのに問題があります。application.local には、次のようなものがあります。

setcookie( 'iPlanetDirectoryPro', trim( $token_id ), '0', '/', '.local' );
header( 'Location: /adcom-sso' );

私もこれを試しました:

header( 'Set-Cookie: iPlanetDirectoryPro=' . trim( $token_id ) . '; path=/' );
header( 'Location: /adcom-sso' );

を使用するsetcookie()と、Cookie は設定されません。ヘッダーを使用してSet-Cookie、Cookie設定されます。両方からリダイレクトを削除しましたが、結果は変わりません。では機能しますSet-Cookieが、では機能しませんsetcookie()。どのソリューションを使用するかはあまり好みではないので、それで問題ありませんが、Set-Cookieソリューションでは、ドメインを追加するとすぐにすべてが壊れます。

header( 'Set-Cookie: iPlanetDirectoryPro=' . trim( $token_id ) . '; path=/; domain=local' );

ドメイン値を追加するとすぐに、ヘッダー エラーが発生します。

Header may not contain more than a single header, new line detected.

ドメイン値を「local」および「.local」として試しました。挙動は変わりません。

明示的に Cookie にアクセスする必要はめったにないので、明らかな何かが欠けていることを願っていますが、確かにそれはわかりません。どんな洞察も大歓迎です。

更新:これをもう少し絞り込んだと思います。ドメイン値を含めない限り、どちらの方法でも機能するようです。Cookie の特定のドメインとして "local" または ".local" を使用すると問題が発生する可能性はありますか?

4

1 に答える 1

2

編集: RFC2109、4.3.2 Rejecting Cookies を見てきました:

  • Domain 属性の値にドットが含まれていないか、ドットで始まっていません。

    ...

  • Domain=.com または Domain=.com. の Set-Cookie は、ドットが埋め込まれていないため、常に拒否されます。

セキュリティ上の懸念から、ブラウザが「.local」を拒否しているようです。ドメインの Cookie を設定するには、少なくとも 2 つのドットが必要です (例: '.cookiedomain.local')。

あるサブドメイン (one.local など) の Cookie を別のサブドメイン (another.local など) に設定することは、知る限り不可能です。この問題を解決するためにできることは、すべての Cookie を設定/取得する Cookie ドメインにユーザーをリダイレクトし、クエリ パラメータとして URL に含まれる Cookie データを使用して、元の場所にユーザーを再度リダイレクトすることです。Microsoft は、独自のドメイン (msn.com、microsoft.com) でこのようにしています (またはしていました)。


取得したエラー (「ヘッダーに含まれていない可能性があります...」) は、引数として渡す文字列にheader()、スペースまたはタブが続かない改行文字が含まれている場合にのみトリガーされます (これにより、ヘッダーが続きます)。次の行)。

現在、setcookie()実際にはurlencode()その値は ( setrawcookie()will not) であるため、改行によってエラーが発生することはありません。

一方、このtrim()関数は、引数の最初と最後から空白のみを取り除き、他の改行文字はそのまま残します。したがって、代わりに次のようなものを試すことができますpreg_replace('/\s+/', '')

このアプローチがうまくいかない理由は、setcookie()私にはすぐにはわかりません。実際には cookie ( で設定setcookie()) が表示されていますが、URL エスケープを期待しておらず、コードのどこかで黙って拒否している可能性があります。

ただし、それは最初のものが機能するように見える理由を説明していませんheader()(改行が含まれています)。Cookie 値の一部に改行が含まれているものと含まれていないものがあるようです。

ちなみに、サブドメインに Cookie を表示させたい場合は、ドメインを「.local」(先頭に「.」) に設定するのが正しい方法です。

Cookie の設定に関する追加の注意事項についてsetcookie()は、PHP のドキュメント (特にユーザー コメント) で説明されています。

于 2009-09-02T23:19:19.537 に答える