2009-09-02 14 views
1

私は2つの "ドメイン"を越えてローカルで作業しています。私は私のマシン上にenterprise.local仮想ホストとapplication.local仮想ホストを持っており、 "local"または ".local"のドメインクッキーを設定する必要があります。私もこれを試してみた問題CookieをPHPで設定する

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

setcookie()を使用して
header('Set-Cookie: iPlanetDirectoryPro=' . trim($token_id) . '; path=/'); 
header('Location: /adcom-sso'); 

は、クッキーがこれまでに設定されていないapplication.localでは、私はこれを持っています。 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"として試しました。動作は変わりません。

私はめったに明示的にクッキーにアクセスする必要はないので、私は明らかに何かを見逃していることを望むが、確かにそれを見ない。どんな洞察も高く評価されるだろう。

更新:私はこれをもう少し絞り込んだと思います。ドメインの値が含まれていない限り、両方の方法でが動作するようです。クッキーの特定のドメインとして "local"または ".local"を使用する際に問題がありますか?

答えて

2

EDIT: 私は今、4.3.2がクッキーを拒否、RFC2109を見て持っていた:

  • The value for the Domain attribute contains no embedded dots or does not start with a dot.

    ...

  • A Set-Cookie with Domain=.com or Domain=.com., will always be rejected, because there is no embedded dot.

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

別のサブドメイン(another.localなど)の1つのサブドメイン(例:one.local)からのクッキーをAFAIKに設定することはできません。この問題を克服するためにできることは、すべてのCookieを設定/取得するCookieドメインにユーザーをリダイレクトし、url asクエリパラメータに含まれるCookieデータを使用してユーザーがどこに来たのかを再度ユーザーにリダイレクトします。マイクロソフトは、独自のドメイン(msn.com、microsoft.com)でこれを好きです(またはした)。


あなたはheader()に引数として渡す文字列はスペースまたはどちらかが続かない改行文字が含まれている場合にのみトリガされます(「ヘッダが...含めることはできません」)を取得エラータブ(次の行のヘッダーを続ける)。

ここでsetcookie()は実際にはurlencode()の値(setrawcookie()になりません)ですので、改行によってエラーは発生しません。

一方、trim()関数は、引数の先頭と末尾の空白のみを取り除き、他の改行文字はそのまま残します。だから、恐らくpreg_replace('/\s+/', '')のようなものを試すことができます。

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

しかし、これはあなたの最初のheader()が(ラインフィードで)機能するように見える理由を説明していません。あなたのクッキー値には改行が含まれているものもあれば、そうでないものもあります。

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

クッキーを設定する際のいくつかの注意点は、PHPのドキュメント(特にユーザーのコメント)に記載されています。setcookie()を参照してください。

+0

私は実際にそれらのすべてを試しました。もともと、私は全くトリミングしていませんでした。私もsetrawcookie()を試しましたが、簡単にするためにここには含めませんでした。 Set-Cookieソリューションでは、$ token_idを手動でurlencode()しようとしました。私はちょうどpreg_replace()のアイデアを試して、それは何も変更されませんでした。ありがとう。 –

+0

"ヘッダーは含まれていない可能性があります"は、そこに改行がない限りトリガーされません。私はPHPのソースコード( 'sapi_header_op()')を見てきました。あなたは間違いなくそのエラーに改行問題があります。 – Inshallah

+0

最終的に私が追跡したものがあなたの編集と一致しました。 ".local.com"を試してみるとすぐにすべてがスムーズに進みました。この場合、問題は私の "ドメイン"を単純に保つ私の開発環境のためでした。これは、本番環境に向けてスタック上で問題になることはありません。ご協力いただきありがとうございます。 –