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

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. Может кто-нибудь помочь с этим?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 4

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

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

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

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

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

Ответ 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*!

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

  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]
    

Ответ 9

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

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

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

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

У меня есть система, построенная в основном на 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

Ответ 13

Файлы являются пояснительными. Сделайте файл, назовите его чем угодно. В моем случае 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 requirement 
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . 
print file_get_contents($kill);

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

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

Ответ 14

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