1

別のサブドメインにあるPHPアプリをAJAX経由で呼び出す(.NET)アプリケーションがあります。問題を分解するために、私は簡単なテストスクリプトを書きました:

<?php
setcookie('test', '1234', time()+60*60*24*30, '/', '.mydomain.com'); 
header('Access-Control-Allow-Origin: *');
echo 'Cookies: '; print_r($_COOKIE); 
?>

直接リクエストによって呼び出された場合、スクリプトは期待どおりに動作します-すべての.mydomain.com Cookieを含む配列を吐き出し、「test」Cookieを設定します。

app1.mydomain.com/page1.aspxからapp2.mydomain.com/cookieTest.phpを呼び出していると仮定します。

app1はIISサーバーで実行され、app2はNginx(Linux)サーバーで実行されています。

したがって、app1.mydomain.com / page1.aspxで、次のJSを実行します。

$.ajax({
    'url' : 'https://app2.mydomain.com/cookieTest.php', 
    'success': function(r){
        $('#container').html(r); 
    }
});

スクリプトは$_COOKIEの空の配列を返し、 Cookieを設定しようとしますが、失敗します。応答ヘッダーは次のようになります。

Request Headers
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:app2.mydomain.com
Origin:https://app1.mydomain.com
Referer:https://app1.mydomain.com/page1.aspx
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1

Response Headers
Access-Control-Allow-Origin:*
Connection:keep-alive
Content-Type:text/html
Date:Fri, 21 Sep 2012 20:54:12 GMT
Server:nginx
Set-Cookie:test=1234; expires=Sun, 21-Oct-2012 20:54:12 GMT; path=/; domain=.mydomain.com
Transfer-Encoding:chunked

(ブラウザが無視するset-cookieに注意してください)

ここで何がうまくいかない可能性がありますか?

4

2 に答える 2

1

さらに調査を行った後 ( http://www.bradchen.com/node/28およびhttps://developer.mozilla.org/en-US/docs/HTTP_access_control )、これは直接達成できないことに気付きましたが、回避策があります。両方の方法(取得と設定)。

実際には非常に簡単です。セッション ID など、渡したい Cookie に含まれているものを渡して、PHP アプリに Cookie の値を読み取らせることができます。また、PHP の headers_list() を解析して新しい Cookie を設定し、ブラウザがそれらの Cookie を設定します。

于 2012-09-29T15:08:27.023 に答える
1

元の URL がHTTPS Origin:https://app1.mydomain.comで、宛先の URL がHTTP http://app2.mydomain.com/cookieTest.phpである可能性があります。

HTTPS サイトをブラウズしていて、そのサイトが HTTP サイトからコンテンツを取得したり、HTTP サイトにリダイレクトしたりしようとすると、ブラウザが警告を発し、確認を求めます。そのため、Cookie がそのポリシーによってブロックされている可能性があります。

于 2012-09-21T21:12:33.003 に答える