我尝试通过另一个域上的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进行测试时,它可以正常工作。
我做错了什么?