Access-Control-Allow-Origin試してみた。

Access-Control-Allow-Origin使うと、
XmlHttpRequestでクロスドメイン接続できるらしいので、そりゃおもしろいとレッツトライ。
とりあえず、テストドメインtest.devの公開領域に次のスクリプトを準備。

<?php
header('Access-Control-Allow-Origin:http://localhost');
header('Content-Type:text/plain;charset=UTF-8');
echo 'Hello World';

で、localhostの公開領域に次のHTMLを置く。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script type="text/javascript" src="ajax.js"></script>
        <title>XmlHttpRequest Level2</title>
    </head>
    <body>
        <h1>XmlHttpRequet Level2</h1>
    </body>
</html>

同様にJavascriptも置く。rpc.phpは冒頭のphpファイル。
ファイル分けた理由はとくになし。

window.onload = function() {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://test.dev/rpc.php', true);
    xhr.onreadystatechange = function() {
        if(xhr.readyState === 4) {
            var res = xhr.responseText;
            alert(res);
        }
    };
    xhr.send(null);
};

で、localhostのhtmlにブラウザアクセス。
アラートでた!Hello World返ってきた!うれしいなぁ。


でもこれ、Cookieを送れないらしいので、そこも調べてみる。
rpc.phpを次のように修正。

<?php
header('Access-Control-Allow-Origin:http://localhost');
header('Content-Type:text/plain;charset=UTF-8');
$msg = ' World';
if(isset($_COOKIE['_test_'])) {
    $msg = ' Again';
} else {
    setcookie('_test_', 'on', time()+864000);
}
echo 'Hello' . $msg;


これで、http://test.dev/rpc.phpを直接ブラウザで開くと、初回はHello World
更新するとCookieが効いてHello Againになる。
この状態で改めてlocalhostから接続を試す(念のためCookieは全部消しておく)。


アラートがHello Worldのまま。何度更新しても変わらない。
Firebugでレスポンスヘッダーみると、サーバからは確かにset-cookieきてるし、
FireCookieでももらったCookie見えるんだけど、次回のリクエストヘッダーにはつかない。


document.cookieから取り出して、自分でヘッダー追加しようと思ったけど、
document.cookieでとれるのはlocalhostcookieだもんね。そりゃ取れんわ。


Firefoxではもらう分は確認できたけど、ChromeとかSafariだとちょっと違うみたい。
開発ツールでみた感じ、set-cookieが表示されない。
ChromeSafariはもらうこともしないのかな。


セッション管理とかしたければ、Cookie以外の方法でってことなんだろうな。


(追記)
と思ったら、方法見つけた。