Ответ 1
Возможно, ваш https-сервер имеет ненадежный сертификат. Если это так, попробуйте сначала обратиться к URL-адресу с вашим браузером и принять ненадежное соединение.
в моем приложении Я создаю запрос AJAX от HTTP до HTTPS. Это означает, что мне нужен CORS. Поэтому я добавляю некоторые заголовки и параметры в jQuery.ajax и тестирую его. В Firefox все работает нормально, но в Chrome нет. Chrome "убивает" каждый запрограммированный запрос (ОПЦИИ).
jQuery script:
$(document).on('click', 'a.ajax', function(e) {
e.preventDefault();
$.ajax(this.href, {
type: 'GET',
dataType: 'json',
crossDomain: false,
headers: {'X-Requested-With': 'XMLHttpRequest'},
xhrFields: {
withCredentials: true
}
});
return false;
});
Сброс HTTP:
> OPTIONS /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Host: local.bar.cz
> Accept: */*
> Access-Control-Request-Headers:accept, origin, x-requested-with
> Access-Control-Request-Method:GET
> Origin:http://local.bar.cz
>
< HTTP/1.1 204
< Server: nginx/1.2.7
< Date: Wed, 27 Feb 2013 15:06:54 GMT
< Content-Type: text/html; charset=utf-8
< Connection: keep-alive
< X-Powered-By: Nette Framework
< X-Frame-Options: SAMEORIGIN
< Access-Control-Allow-Origin: http://local.bar.cz
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: accept, origin, x-requested-with
< Access-Control-Allow-Methods: OPTIONS, GET, POST, HEAD
<
кто-нибудь знает, почему хром убил этот запрос?
Возможно, ваш https-сервер имеет ненадежный сертификат. Если это так, попробуйте сначала обратиться к URL-адресу с вашим браузером и принять ненадежное соединение.
Принятие сертификата не всегда решает эту проблему. Если вы используете самозаверяющий сертификат, ДАЖЕ ЕСЛИ ВЫ ПРИНИМАЕТЕ ЕГО ПЕРВЫЙ, Chrome все равно в некоторых случаях отменит ваши предполетные запросы OPTIONS. Так было с 2011 года:
Обходной путь, указанный на этой странице, заключается в том, чтобы добавить самозаверяющий сертификат в системный список доверенных сертификатов.
Инструкции для этого на Mac (слегка измененный от оригинала, так что он работает с OS 10.8.5 http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/):
Вам может потребоваться перезапустить Chrome, чтобы сертификат полностью доверял (значок изменился на счастливую зеленую блокировку в строке url).
Стоит упомянуть, что есть еще один случай, который дает абсолютно одинаково выглядящие результаты:
Если вы переместите браузер на другой URL-адрес (window.location..), ожидая возврата запроса (то есть через обещание), тогда будет отправлен запрос OPTIONS, но последующий ответ (POST/GET/*) будет отменено (естественно..)
Да.. конечно.. это ошибка, если вы это сделаете... но она может выглядеть одинаково и потреблять часы, чтобы смотреть в неправильном месте. рассмотрим такой код:
makeAjaxCallThatReturnsAPromise.then(
function () { // doSomething },
function () { // doSomethingElse }
);
location.replace('http://some.where/');