Firefox 'Cross-Origin Request Blocked' несмотря на заголовки

Я пытаюсь сделать простой перекрестный запрос, и Firefox последовательно блокирует его с этой ошибкой:

Блокирован перекрестный запрос: одна и та же политика происхождения запрещает чтение удаленного ресурса по адресу [url]. Это можно исправить, переместив ресурс в тот же домен или включив CORS. [URL]

Отлично работает в Chrome и Safari.

Насколько я могу судить, я установил все правильные заголовки в моем PHP, чтобы это работало. Вот что отвечает мой сервер

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:15:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Vary: Accept-Encoding
Content-Length: 186
Content-Type: text/html

Я пытался использовать Angular, JQuery и базовый XMLHTTPRequest объект, вот так:

var data = "id=1234"
var request = new XMLHttpRequest({mozSystem: true})
request.onload = onSuccess;
request.open('GET', 'https://myurl.com' + '?' + data, true)
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
request.send()

... и он работает в любом браузере, кроме Firefox. Может кто-нибудь помочь с этим?

18 ответов

Решение

Оказывается, это не имеет ничего общего с CORS- это была проблема с сертификатом безопасности. Вводящие в заблуждение ошибки = 4 часа головной боли.

Я обнаружил, что моя проблема была в том, что сервер, которому я отправил перекрестный запрос, имел сертификат, которому не доверяли.

Если вы хотите подключиться к кросс-домену с https, вы должны сначала добавить исключение для этого сертификата.

Вы можете сделать это, посетив заблокированную ссылку один раз и добавив исключение.

Я столкнулся с этим вопросом, обнаружив, что запросы в Firefox блокируются сообщением:

Причина: запрос CORS не выполнен

После того, как я выдернул свои волосы, я обнаружил, что недавно установленное расширение Firefox, Privacy Badger, блокирует запросы.

Если вы пришли к этому вопросу после того, как почесали свою голову, попробуйте проверить, какие расширения вы установили, чтобы увидеть, блокирует ли какое-либо из них запросы.

См. Причина: запрос CORS для MDN не был выполнен успешно.

Если у вас нет "настоящего" сертификата (и, следовательно, вы используете самозаверяющий сертификат), в FireFox вы можете перейти по адресу:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Add Exception.

Там заполните местоположение, например: https://wwww.myserver:myport

Я нашел решение через 2 дня:(.

Важное примечание: при ответе на запрос учетных данных сервер должен указать домен и не может использовать групповые символы.

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

Просто слово предупреждений. Я наконец обошел проблему с Firefox и CORS.

Решением для меня был этот пост

Настройка CORS (совместное использование ресурсов из разных источников) в Apache с правильными заголовками ответов, позволяющими все через | Бенджамин Хорн

Однако Firefox вел себя очень, очень странно после установки этих заголовков на сервере Apache (в папке.htaccess).

Я добавил много console.log("Hi FF, you are here A") и т.д., чтобы увидеть, что происходит.

Сначала это выглядело так, как будто xhr.send(), Но потом я обнаружил, что не дошел до этого утверждения. Я разместил другой console.log прямо до него так и не доехал - хотя между последним не было ничего console.log и новый. Это просто остановилось между двумя console.log,

Изменение порядка строк, удаление, чтобы увидеть, есть ли какой-либо странный символ в файле. Я ничего не нашел.

Перезапуск Firefox устранил проблему.

Да, я должен сообщить об ошибке. Просто это так странно, поэтому не знаю, как это воспроизвести.

ВНИМАНИЕ: И, о, я только что сделал Header always set части, а не Rewrite* часть!

Для потомков также проверьте журналы сервера, чтобы увидеть, возвращает ли запрашиваемый ресурс 200.

Я столкнулся с аналогичной проблемой, когда все нужные заголовки возвращались в запросе ajax перед полетом, но браузер сообщил, что фактический запрос был заблокирован из-за неправильных заголовков CORS.

Оказывается, запрашиваемая страница возвращала ошибку 500 из-за неверного кода, но только когда она была получена через CORS. Браузер (как Chrome, так и Firefox) по ошибке сообщил, что заголовок Access-Control-Allow-Origin отсутствует, вместо того, чтобы сказать, что страница вернула 500.

Ubuntu Firefox выдает ошибку сбоя CORS, когда обработка моего запроса заняла более 10 секунд.

Ничего общего с КОРС. Проблема в конфигурации ubuntu firefox.

Я обновил network.notify.changed до false, что сделало это исправление.


Справочник по ошибкам Mozilla:

https://bugzilla.mozilla.org/show_bug.cgi?id=1238377

https://bugzilla.mozilla.org/show_bug.cgi?id=1235509

Просто добавь

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

к .htaccess файл в корне сайта, с которым вы пытаетесь соединиться.

Для отладки проверьте журналы сервера, если это возможно. Firefox возвращает ошибки CORS в консоли по целому ряду причин.

Одной из причин является также плагин uMatrix (и я думаю, NoScript и тому подобное).

В моем случае это был мой ADBLOCKER! По какой-то причине он был включен на моем локальном хосте и вызывал эту ошибку в Firefox.

Отключение его или удалить в плагин должен это исправить.

В вашем случае это может быть не блокировщик рекламы, а другой плагин Firefox. Сначала протестируйте его в режиме инкогнито без плагинов, чтобы определить, является ли это проблемой, а затем систематически отключите плагины, пока не найдете виновника.

В моем случае ошибка CORS возникала только в запросах POST с файловыми вложениями, отличными от небольших файлов.

После многих потраченных впустую часов мы обнаружили, что запрос был заблокирован для пользователей, которые использовали Kaspersky Total Control.

Возможно, что другие антивирусные программы или брандмауэры могут вызывать аналогичные проблемы. Kaspersky выполняет некоторые тесты безопасности для запросов, но пропускает их для веб-сайтов с сертификатом SSL EV, поэтому получение такого сертификата должно решить эту проблему должным образом.

Отключить защиту для вашего домена немного сложно, поэтому вот необходимые шаги (по состоянию на декабрь 2020 г.): Настройки -> Настройки сети -> Управление исключениями -> Добавить -> ваш домен -> Сохранить.

Хорошо, что вы можете обнаружить такой заблокированный запрос. Ошибка пустая - у нее нет статуса и ответа. Таким образом, вы можете предположить, что он был заблокирован сторонним программным обеспечением, и показать некоторую информацию.

Попробуйте это, это должно решить вашу проблему

  1. В вашем config.php добавьте www pre в вашем domain.com. Например:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
    
  2. Добавьте это в ваш файл.htaccess

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
    

Для меня оказывается, что я устанавливал Access-Control-Allow-Origin заголовок ответа на конкретный (и правильный) host.com но он должен был быть возвращен как http://host.com вместо. Что делает Firefox? Он молча проглатывает запрос GET и возвращает статус 0 в XHR без вывода предупреждений на консоль javascript, тогда как для других подобных сбоев он по крайней мере что-то говорит. Ай ай.

Если вышеупомянутые ответы не помогают, проверьте, запущен ли внутренний сервер или нет, так как в моем случае сервер разбился, и эта ошибка оказывается полностью вводящей в заблуждение.

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

У меня есть система, построенная в основном на Symfony 3. Для самообучения и повышения производительности я решил написать несколько скриптов, используя также GoLang, API с открытым доступом.

My Go API ожидает параметры формата Json, а также возвращает ответ в формате Json

Для вызова тех GoApi, которые я использую, чаще всего, $.ajax ( jQuery) Первый тест был обманом: всплывающее (не) известное "Блокировка перекрестного запроса"! Затем я попытался установить "Access-Control-Allow-Origin: *" в apache conf, htaccess, php, javascript и в любом другом месте, где я мог найти в Google!

Но, даже, такая же расстраивающая ошибка!!!

Решение было простым: мне нужно было делать "POST" запросы вместо "GET" .

Чтобы добиться этого, мне пришлось настроить GoLang и JavaScript для использования GET! Как только это будет сделано, для меня больше не будет блокироваться запрос о происхождении товара!!!

Надеюсь, поможет

PS:

Я использую Apache и Vhost, на блоке каталогов у меня есть

  Header always set Access-Control-Allow-Origin "*"
  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Помните: "*" означает, что вы будете принимать запросы от кого-либо!!! (Что может быть недостатком безопасности) В моем случае это нормально, потому что это будет публичный API

PS2: мои заголовки

Заголовки ответа

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

Заголовки запроса (469 B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0

Файлы говорят сами за себя. Сделайте файл, назовите его как угодно. В моем случае jq2.php.

<html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    // document is made ready so that the program starts when we load this page       
    $(document).ready(function(){

        // it tells that any key activity in the "subcat_search" filed will execute the query.
        $("#subcat_search").keyup(function(){

            // we assemble the get link for the direction to our engine "gs.php". 
            var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();

            $.ajax({
                url: link1,
                // ajax function is called sending the input string to "gs.php".
                success: function(result){
                    // result is stuffed in the label.
                    $("#search_val").html(result);
                }
            });
        })   

    });
</script>
</head>

<body>

<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>

</body>
</html>

Теперь мы включим движок, создадим файл, назовем его как угодно. В моем случае это gs.php.

$head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head
$key = "your key here"; //your key
$hay = $_GET['needle'];

$hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement 
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . 
print file_get_contents($kill);

Я старался сделать пример как можно более простым. И поскольку он выполняет ссылку при каждом нажатии клавиши, квота вашего API будет расходоваться довольно быстро.

Конечно, нет конца тому, что мы можем сделать, например, поместить данные в таблицу, отправить в базу данных и так далее.

Кажется, это ошибка в Firefox 44, которая была исправлена ​​в версии 45.

Другие вопросы по тегам