我有一个(.NET)应用程序,它通过 AJAX 调用驻留在不同子域上的 PHP 应用程序。为了解决这个问题,我写了一个简单的测试脚本:
<?php
setcookie('test', '1234', time()+60*60*24*30, '/', '.mydomain.com');
header('Access-Control-Allow-Origin: *');
echo 'Cookies: '; print_r($_COOKIE);
?>
如果通过直接请求调用,脚本会按预期运行 - 输出一个包含所有 .mydomain.com cookie 的数组并设置“测试”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
(注意设置cookie,浏览器会忽略它)
这里可能出了什么问题?