CORS:Apache在预检OPTIONS上提供了404

时间:2016-09-19 20:32:35

标签: javascript apache google-chrome cors basic-authentication

我尝试通过另一个域上的XHR客户端请求进行基本HTTP身份验证,但在Chrome中,我发出:

  

XMLHttpRequest无法加载https://my-remote-domain.com。回应   预检具有无效的HTTP状态代码404

加载了mod_headers的apache服务器配置如下(apache.conf):

Header always set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Cache-Control, Host"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Credentials "true"
Header always set Access-Control-Max-Age "1000"

我尝试使用通配符"*"但Chrome似乎拒绝在客户端将Credentials标头设置为true时。

另一种解决方案是使用正则表达式来进行子域,这可行:

SetEnvIf Origin "^(https?://localhost|https://(.*)+\.domain\.com\.fr)$" ORIGIN_SUB_DOMAIN=$1
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN

但现在我已经停留在飞行前OPTIONS响应中的404错误代码上。

即使强制Apache在HTTP OPTIONS方法调用上返回200,我仍然有404:

RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]

JavaScript代码:

function connect(login, passwd){
    var xhr = new XMLHttpRequest();

    xhr.open("GET", 'https://my-remote-domain.com', true);
    xhr.withCredentials = true;
    xhr.setRequestHeader("Authorization", 'Basic ' + btoa(login + ':' + passwd));
    xhr.onload = function () {
        console.log(xhr.responseText);
    };
    xhr.send();
}

注意:在使用chrome.exe --disable-web-security --user-data-dir进行测试时使用chrome进行测试时,它可以正常工作。

我做错了什么?

0 个答案:

没有答案