Ответ 1
Это ошибка в Google Chrome: http://code.google.com/p/chromium/issues/detail?id=96007.
Я пытаюсь отправить простой запрос CORS на внешний сервер приложений, который использует ключ сеанса для авторизации.
$.ajax({
type: "GET",
url: "https://192.168.1.72:8442/api/file/",
headers: {"Authorization": "3238562439e44fcab4036a24a1e6b0fb"}
});
Он отлично работает в Firefox 18, Opera 12.12 и Rekonq 2.0 (использует также WebKit), но не работает в Google Chrome (проверенные версии 21 и 24). В Google Chrome показано, что ресурс OPTIONS Resource не загружается в Network Inspector, и сервер приложений не получает никакого запроса. Я пробовал jQuery 1.8.3 и 1.9.0.
Request URL:https://192.168.1.72:8442/api/file/
Request Headers
Access-Control-Request-Headers:accept, authorization, origin
Access-Control-Request-Method:GET
Cache-Control:no-cache
Origin:https://192.168.1.72:8480
Pragma:no-cache
Если я удаляю заголовки из запроса, я получаю 401 также в Google Chrome и могу получить доступ к ресурсу, если авторизация отключена на сервере приложений. Не имеет значения, какие заголовки отправлены. Только заголовок, который я могу отправить, это { "Content-Type": "plain/text" }. Все другие имена/значения заголовков приводят к ошибке в Google Chrome, но работают во всех браузерах, о которых я упоминал выше.
Почему Google Chrome не обрабатывает заголовки в запросе CORS?
Это ошибка в Google Chrome: http://code.google.com/p/chromium/issues/detail?id=96007.
Я использую самозаверяющий сертификат на моем сервере api, и это, похоже, проблема. Я обнаружил, что если я запустил Google Chrome с опцией --disable-web-security
, тогда работает CORS с заголовками запросов. Без --disable-web-security
я могу отправлять запросы CORS на самозаверяющий сервер api, но не могу добавлять заголовки (кроме Content-Type).
Я обнаружил, что Access-Control-Allow-Headers: * должен быть установлен ТОЛЬКО для запроса "ОПЦИИ". Если вы вернете его для запроса POST, браузер отменит запрос (по крайней мере, для хрома)
Следующий код PHP работает для меня
// Allow CORS
header("Access-Control-Allow-Origin: *");
header('Access-Control-Allow-Credentials: true');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS");
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Allow-Headers: *");
}
Я нашел похожие вопросы с некоторыми вводящими в заблуждение ответами: - Серверный поток говорит, что это ошибка с хромом на 2 года: Access-Control-Allow-Headers не соответствует локальному хосту. Это неправильно: я могу использовать CORS для моего локального сервера с Post Post - Access-Control-Allow-Headers принимает подстановочные знаки. Это также неправильно, подстановочный шаблон для меня (я тестировал только с Chrome)
Мне понадобится полдня, чтобы выяснить проблему.
Счастливое кодирование
Серверная сторона: Сервер должен установить заголовок "Access-Control-Allow-Credentials", а также установить разрешенные заголовки в "Access-Control-Allow-Headers".
Клиентская сторона. Вы можете установить xhrFields в $.ajax() вместо явно передающего заголовок Auth.
xhrFields: {
withCredentials: true
}
Подробнее здесь.