ドメインをまたぐために必要なAccess-Control-Allow-Originヘッダですが、複数のオリジンドメインを簡単に指定できる方法を紹介します。


仕様では

W3CのCORS(Cross-Origin Resource Sharing)の記事を見てみるとスペース区切りで複数のOriginを許可することが可能と書いてありますが、現在の最新版のChrome(31.0.1650.63)では対応していないようです(指定方法がダメ?)。
http://www.w3.org/TR/cors/#access-control-allow-origin-response-header

スクリーンショット_2013-12-19_16.01.33-25
拒否される様子

対処法

フォーラムなどをみるとAccess-Control-Allow-Origin: *を指定するように言われたり、PHP側で要求してきたOriginをheader関数を使って返せとか言っているのですが、セキュリティ意味ない感じがするし、ソース書き換えるのは大変めんどくさいです。

そのため、Apacheの設定でSetEnvIfを使って少し工夫します。
Apacheの設定ファイルに以下のように記述します。

SetEnvIf Origin "^https?://(api|web).example.com$" ORIGIN=$0
Header set Access-Control-Allow-Origin %{ORIGIN}e env=ORIGIN

このコードだと許可されるドメインは以下のとおりです。

http://api.example.com
https://api.example.com
http://web.example.com
https://web.example.com


リクエストヘッダのOriginが正規表現にマッチしたらORIGIN変数にマッチしたOriginを代入して、ORIGINがある場合のみAccess-Control-Allow-Originを返してる感じです。
"^https?://(api|web).example.com$"の部分は正規表現になっているため、セカンドレベルドメインを変えることも可能です。

参考
http – Access-Control-Allow-Origin Multiple Origin Domains? – Stack Overflow