我正在尝试从一个域上的页面向另一个域上的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对象。
答案 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);