【问题标题】:PHP application fails to read or set cookie on AJAX call from a different domainPHP 应用程序无法读取或设置来自不同域的 AJAX 调用的 cookie
【发布时间】:2012-09-21 21:06:59
【问题描述】:

我有一个 (.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,浏览器会忽略它)

这里可能出了什么问题?

【问题讨论】:

    标签: ajax cookies cross-domain


    【解决方案1】:

    可能源 url 是 HTTPS Origin:https://app1.mydomain.com 而目标 url 是 HTTP http://app2.mydomain.com/cookieTest.php

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

    【讨论】:

    • 实际上这是我在转录时的错误 - 我已经使用全 https 或全 http 解决方案进行了测试,这不会改变结果。感谢您指出这一点。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-25
      • 2018-09-28
      • 2021-01-01
      • 2021-07-27
      • 1970-01-01
      • 2010-10-22
      • 2020-07-19
      • 2023-03-18
      相关资源
      最近更新 更多