1

我正在尝试将跨域请求从一个域上的页面发送到另一个域上的 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 OK
Date: Fri, 14 Jun 2013 17:20:19 GMT
Server: 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, 19 Nov 1981 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; expires=Fri, 28-Jun-2013 17:20:19 GMT
key2=248fbaf41cdd698549fdddb341927885; expires=Fri, 28-Jun-2013 17:20:19 GMT
Content-Length: 8
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8

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

我看了很多问题,但这一个真的很棘手,我找不到任何解决方案。

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

4

1 回答 1

4

将 header 设置Access-Control-Allow-Credentials为 true 时,您不能对 header 使用通配符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);
于 2013-06-14T17:39:38.650 回答