Подтвердить что ты не робот

Почему Chrome отменяет запрос CORS OPTION

в моем приложении Я создаю запрос 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
< 

кто-нибудь знает, почему хром убил этот запрос?

4b9b3361

Ответ 1

Возможно, ваш https-сервер имеет ненадежный сертификат. Если это так, попробуйте сначала обратиться к URL-адресу с вашим браузером и принять ненадежное соединение.

Ответ 2

Принятие сертификата не всегда решает эту проблему. Если вы используете самозаверяющий сертификат, ДАЖЕ ЕСЛИ ВЫ ПРИНИМАЕТЕ ЕГО ПЕРВЫЙ, Chrome все равно в некоторых случаях отменит ваши предполетные запросы OPTIONS. Так было с 2011 года:

Обходной путь, указанный на этой странице, заключается в том, чтобы добавить самозаверяющий сертификат в системный список доверенных сертификатов.

Инструкции для этого на Mac (слегка измененный от оригинала, так что он работает с OS 10.8.5 http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and-self-signed-ssl-certificates/):

  • В адресной строке нажмите маленькую блокировку с помощью X. Это вызовет небольшой информационный экран.
  • Нажмите кнопку с сообщением "Информация о сертификате".
  • Нажмите и перетащите изображение сертификата на на рабочем столе в открытое окно поиска (оно не похоже на перетаскивание на рабочий стол.
  • Дважды щелкните созданный файл. Это вызовет утилиту Keychain Access. Введите свой пароль, чтобы разблокировать его.
  • Обязательно добавьте сертификат в системную цепочку ключей, а не в цепочку ключей входа в систему. Нажмите "Всегда доверять", хотя это, похоже, ничего не делает.
  • После того, как он был добавлен, дважды щелкните его. Возможно, вам придется пройти аутентификацию снова.
  • Разверните раздел "Доверие". "При использовании этого сертификата установите" Всегда доверять "

Вам может потребоваться перезапустить Chrome, чтобы сертификат полностью доверял (значок изменился на счастливую зеленую блокировку в строке url).

Ответ 3

Стоит упомянуть, что есть еще один случай, который дает абсолютно одинаково выглядящие результаты:

Если вы переместите браузер на другой URL-адрес (window.location..), ожидая возврата запроса (то есть через обещание), тогда будет отправлен запрос OPTIONS, но последующий ответ (POST/GET/*) будет отменено (естественно..)

Да.. конечно.. это ошибка, если вы это сделаете... но она может выглядеть одинаково и потреблять часы, чтобы смотреть в неправильном месте. рассмотрим такой код:

makeAjaxCallThatReturnsAPromise.then(
    function () { // doSomething },
    function () { // doSomethingElse }
);
location.replace('http://some.where/');