跨域AJAX withCredentials,PHP返回标题内容长度,但没有内容

时间:2013-06-14 17:27:54

标签: php javascript ajax http-headers cross-domain

我正在尝试从一个域上的页面向另一个域上的PHP服务器发送跨域请求。没有凭据(我需要会话),一切正常,但只要我添加凭据,它就不起作用。

这是JS代码:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://phpserver.net',true);
xhr.withCredentials = true ;
xhr.onreadystatechange = function(e) {
    if (this.readyState == 4 && this.status == 200) {
        alert(this.responseText);
    }
}
xhr.send();

请记住,它没有凭据就可以使用。现在没有警报。 所以我用Firebug检查了网络:

服务器正确处理了请求,它收到了HTTP代码200,但没有内容。 我检查了标题:

  

HTTP / 1.1 200确定

     

日期:2013年6月14日星期五17:20:19 GMT

     

服务器:Apache / 2.4.2(Win64)PHP / 5.4.3

     

X-Powered-By:PHP / 5.4.3

     

Access-Control-Allow-Origin:*

     

access-control-allow-credentials:true

     

Expires:Thu,1981年11月19日08:52:00 GMT

     

Cache-Control:no-store,no-cache,must-revalidate,post-check = 0,pre-check = 0

     

Pragma:no-cache

     

Set-Cookie:key = 441wqr3e4cf2456c763c1ea173aa06b5ad284e5f38;到期=星期五,2013年6月28日17:20:19 GMT   键2 = 248fbaf41cdd698549fdddb341927885; expires =星期五,2013年6月28日17:20:19 GMT

     

内容长度:8

     

保持活跃:超时= 5,最大= 100

     

连接:Keep-Alive

     

Content-Type:text / html;字符集= UTF-8

最后我最奇怪的发现: 标题“Content-Length”实际上显示了真实的内容长度!如果我添加回声“foo”,内容长度增加3,依此类推。

我看了很多问题,但这个问题非常棘手,我找不到任何解决方案:(

编辑: 我忘了提到这个请求有效,如果我使用用户脚本和GM_xhr函数而不是xmlHttpRequest对象。

1 个答案:

答案 0 :(得分:4)

将标头Access-Control-Allow-Credentials设置为true时,不能对标头Access-Control-Allow-Origin使用通配符。也就是说,必须指定特定主机。

而不是:

Access-Control-Allow-Origin: *

使用:

Access-Control-Allow-Origin: http://safedomain.com

您甚至可以将Access-Control-Allow-Origin标头设置为请求中收到的Origin标头。不确定PHP,但使用Java Servlets API:

String origin = request.getHeader("Origin");    
request.setHeader("Access-Control-Allow-Origin", origin);