PHP应用程序无法在来自其他域的AJAX调用上读取或设置cookie

时间:2012-09-21 21:07:00

标签: ajax cookies cross-domain

我有一个(.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吐出数组并设置“test”cookie。

我们假设我从app1.mydomain.com/page1.aspx调用app2.mydomain.com/cookieTest.php。

app1正在Nginx(Linux)服务器上的IIS服务器app2上运行。

所以,在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)

这里可能出现什么问题?

2 个答案:

答案 0 :(得分:1)

原始网址可能是 HTTPS Origin:https://app1.mydomain.com,目标网址是 HTTP http://app2.mydomain.com/cookieTest.php

当我浏览HTTPS网站并且该网站想要从HTTP网站获取内容或重定向到HTTP网站时,浏览器会提醒我并要求我确认这样做。因此,您的cookie可能会被该政策阻止。

答案 1 :(得分:1)

经过一些更多的研究(http://www.bradchen.com/node/28https://developer.mozilla.org/en-US/docs/HTTP_access_control)后,我意识到这是不可能直接实现的,但两种方式(获取和设置)都有变通方法。

实际上非常简单:您可以通过传递会话ID或我们想要传递的cookie中的其他内容来获取PHP应用程序来读取cookie值,并通过解析PHP的headers_list()并创建JS来设置新的cookie让浏览器设置这些cookie。