В общем, я склонен считать, что это баг в jQuery. Я написал код для CORS с Basic Auth «руками» без jQuery, он работает как минимум в Fx 10 и 17 и в Opera 12.10
Код следующий:
на клиенте —
<!DOCTYPE html>
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CORS testing</title>
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function() {
document.getElementById("1").addEventListener("click", function() {
var xhr = new XMLHttpRequest();
xhr.onload = function(e) {
document.getElementById("2").textContent = xhr.responseText;
};
xhr.open("GET", "http://dev.merlin-vrn.tk/cors/api.php", true);
// xhr.withCredentials = true;
xhr.setRequestHeader("Authorization", "Basic dGVzdHVzZXI6dGVzdHBhc3N3b3Jk");
xhr.send();
}, false);
}, false);
</script>
</head><body>
<button id="1">Click me</button>
<div id="2"></div>
</body></html>
на севрере —
<?php
if (isset($_SERVER['HTTP_ORIGIN']))
header("Access-Control-Allow-Origin: $_SERVER[HTTP_ORIGIN]");
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
header("Access-Control-Allow-Methods: $_SERVER[HTTP_ACCESS_CONTROL_REQUEST_METHOD]");
if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
header("Access-Control-Allow-Headers: $_SERVER[HTTP_ACCESS_CONTROL_REQUEST_HEADERS]");
} else {
header('WWW-Authenticate: Basic realm="API"');
header("Content-Type: application/json");
if (isset($_SERVER['PHP_AUTH_USER']) && $_SERVER['PHP_AUTH_USER'] == "testuser" && isset($_SERVER['PHP_AUTH_PW']) && $_SERVER['PHP_AUTH_PW'] == "testpassword") {
header('HTTP/1.1 200 OK');
echo '{"result": "ok"}';
} else {
echo '{"result": "noauth"}';
}
}
file_put_contents("api-log.txt", "$_SERVER[REQUEST_METHOD] $_SERVER[REQUEST_URI] $_SERVER[SERVER_PROTOCOL]\n", FILE_APPEND);
file_put_contents("api-log.txt", print_r($GLOBALS, true), FILE_APPEND);
file_put_contents("api-log.txt", "\n\n", FILE_APPEND);
?>
Логирование в конце этого скрипта — просто для удобства при тестировании. Живьём можно видеть
здесь.
P.S. господа, подскажите хайлайтер для хабра, а?