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

119

Я пытаюсь сделать простой запрос с перекрестным происхождением, и 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. Может кто-нибудь помочь с этим?

Godwhacker
источник
Можете ли вы предоставить полный список всех запросов и ответов? Или предоставить хотя бы тестовый сайт? Если веб-сайт обращается к удаленному источнику http, https, file? mozSystemне поддерживается для обычных веб-сайтов, только для упакованных приложений firefox-os , поэтому откажитесь от этой опции.
nmaier
1
@nmaier Заголовки при отправке как POST, а не GET: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 Ошибка: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]
Godwhacker
2
@nmaier На самом деле похоже, что это какая-то проблема с сертификатом безопасности на сайте, к которому я обращаюсь - Firefox просто выдает ложную ошибку. Если я добавлю сайт в список исключений, он будет работать нормально.
Godwhacker

Ответы:

123

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

Godwhacker
источник
3
Просто возникла эта точная проблема, ошибка слишком общая, и, кроме того, Chrome и Firefox используют разные хранилища сертификатов, поэтому ее сложнее отлаживать. Я должен был подозревать, что когда мой прокси-сервер не перехватывает запросы OPTIONS (это нарушает рукопожатие SSL).
Daniel Correia
4
Godwhacker, возможно, я столкнулся с той же проблемой. Как вы узнали, что это сертификат безопасности? Где это можно увидеть?
Лео
9
В моем случае у меня было приложение angular, которое звонило на другой сервер, причем оба использовали сертификаты с внутренней подписью. Однако Firefox не доверяет сертификату автоматически, потому что он не признан государственным органом. Поэтому мне нужно было убедиться, что сертификаты для обоих серверов были добавлены как исключения в Firefox, прежде чем эта проблема исчезнет.
Сэм Стори,
3
Для меня исправление заключалось в установке withCredentials=trueэкземпляра XHR; в противном случае Firefox не смог использовать клиентский сертификат при выполнении запроса (однако в Chrome работал нормально).
Клинт Харрис,
1
Комментарий @SamStorie больше похож на ответ, чем на этот ответ. Спасибо
Naga
27

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

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

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

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

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

Профессор программирования
источник
как вы выяснили, какое расширение блокирует запросы? У меня та же проблема, поскольку запрос успешно выполняется в Firefox с новым профилем (без расширений),
Сиприан Томоягэ,
1
Я щелкал каждое расширение, чтобы увидеть, есть ли упоминания о блокировке контента для конкретного сайта, с которым у меня возникла проблема. У Ghostery была запись, поэтому я пометил сайт как надежный, перезагрузил страницу, и запросы были выполнены.
Профессор программирования
1
Спасибо! Я также обнаружил расширение Project Insight, которое дает обзор разрешений всех расширений. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă
1
@awendt Oof. Privacy Badger для меня тоже. Спасибо.
Джейсон Лич
26

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

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

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

Cracker0dks
источник
5
Это не особо поможет никому, посещающему ваш сайт, если только вы не будете счастливы разместить там сообщение: «Если вы используете Firefox, перейдите на этот сайт и добавьте его в свой список исключений»
Godwhacker
@ Cracker0dks «посетите заблокированную ссылку один раз и добавьте исключение» не могли бы вы уточнить, где добавить исключение? Я использую Firefox Quantum. TIA
Пол
1
вы переходите по ссылке, на которую Firefox прямо жалуется. Затем вы получите предупреждение о сертификате. Разрешить сертификат. Снова посетите свой основной сайт.
Cracker0dks
13

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

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

Введите адрес, например: https: //wwww.myserver: myport

Hypenate
источник
это сработало для меня, когда мой CORS работает во всех других браузерах, кроме Firefox, с ошибкой -> Запрос перекрестного происхождения заблокирован: та же политика происхождения запрещает чтение удаленного ресурса на localhost: 44304 / v1 / search . (Причина: запрос CORS не выполнен).
JGilmartin,
5

Несколько предупреждений. Наконец-то я решил проблему с 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*часть!

Лео
источник
По сути, такая же история для меня сегодня. Это исправлено при перезапуске Firefox. Более 5 лет спустя.
Сорен Мортенсен
3

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

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

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

Gareth
источник
Это нормально, если вы хотите настроить его для приема запросов отовсюду; не нормально, если вы этого не сделаете, что и составляет весь смысл заголовка.
Godwhacker
2

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

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

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

Джек Стоуфер
источник
1

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

  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]
Дхармендра Маникпури
источник
1

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

rogerdpack
источник
1
Похоже, схема ожидаема, глядя на примеры на w3.org/TR/cors, но в любом случае спасибо, я тоже делал не то, и да, сообщение об ошибке Firefox отсутствует.
Ричард Грин
1

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

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

johndodo
источник
0

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

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

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

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

Но, даже, такая же досадная ошибка !!!

Решение было простым: мне пришлось отправлять запросы «POST» вместо «GET».

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

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

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
Диего Фаверо
источник
0

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

Нирадж Севани
источник
0

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

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

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

Кристиан Хит
источник
-3

Файлы говорят сами за себя. Сделайте файл, назовите его как угодно. В моем случае 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 будет израсходована довольно быстро.

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

Harsh Mehta
источник
Пожалуйста, не отправляйте один и тот же ответ более одного раза. И убедитесь, что ваш ответ действительно отвечает на вопрос. Если вам нужно направить кого-то в другое место для получения дополнительной информации, это не лучший ответ.
эликсенид
Здравствуйте, я использовал ссылку, потому что в ней есть дополнительная информация, например, предварительные требования и т. Д. Если вы чувствуете, что он в порядке, я удалю его.
Harsh Mehta