Незважаючи на заголовки, Firefox "Запит на перехресне походження заблокований"


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. Хтось може допомогти у цьому?


Чи можете ви надати повний слід про всі запити та відповіді? Або надати хоча б тестовий сайт? Якщо веб-сайт, що має доступ до віддаленого походження http, https, файл? 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

Відповіді:


121

Виявляється, це не має нічого спільного з CORS - це була проблема з сертифікатом безпеки. Оманливі помилки = 4 години головних болів.


3
Просто у цієї точної проблеми помилка надто загальна, і крім того, що Chrome і Firefox використовують різні сховища сертифікатів, тому її важче налагоджувати. Я мав би підозрювати, що коли мій проксі не захоплював жодних запитів OPTIONS (він руйнувався під час передачі SSL).
Даніель Коррея

4
Godwhacker, я, можливо, зіткнувся з тією ж проблемою. Як ви дізналися, що це сертифікат безпеки? Де ви можете це побачити?
Лев

9
У моєму випадку у мене був кутовий додаток для здійснення дзвінків на інший сервер, причому обидва використовували внутрішньо підписані сертифікати. Однак Firefox автоматично не довіряє cert, оскільки його не визнають державні органи. Тому мені потрібно було переконатися, що серти для обох серверів були додані як винятки в Firefox до того, як ця проблема пішла.
Сем Сторі

3
Для мене виправленням було встановити withCredentials=trueна примірник XHR; в іншому випадку Firefox не вдалося використати клієнтський сертифікат під час подання запиту (однак, він добре працював у Chrome).
Клінт Харріс

1
Коментар @SamStorie звучить більше як відповідь, ніж ця відповідь. Дякую
Нага

26

Я виявив, що моя проблема полягала в тому, що сервер, якому я надіслав крос-запит, мав сертифікат, якому не довіряли.

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

Це можна зробити, відвідавши заблоковане посилання один раз та додавши виняток.


5
Це особливо не допомагає всім, хто відвідує ваш сайт, якщо тільки ви щасливі, не помістіть на нього повідомлення, "Якщо ви використовуєте Firefox, будь ласка, перейдіть на цей сайт і додайте його до свого списку винятків"
Godwhacker,

@ Cracker0dks "відвідайте заблоковане посилання один раз і додайте виняток", чи можете ви детальніше розглянути, де додати виняток? Я використовую Firefox Quantum. TIA
Пол

1
Ви переглядаєте посилання, що Firefox скаржиться прямо. Потім ви отримуєте попередження про сертифікат. Дозволити сертифікат. Відвідайте свій основний сайт ще раз.
Cracker0dks

26

Я натрапив на це запитання, виявивши запити в Firefox заблоковано повідомленням:

Причина: запит CORS не вдався

Витягнувши волосся, я з’ясував, що нещодавно встановлене розширення Firefox, Privacy Badger, блокує запити.

Якщо ви прийшли до цього питання після того, як почухаєте голову, спробуйте перевірити, які розширення ви встановили, щоб побачити, чи блокує якісь із них запити.

Дивіться причину: запит CORS не вдався до MDN для отримання детальної інформації.


як ви з’ясували, яке розширення блокує запити? У мене є та сама проблема, оскільки запит вдається Firefox з новим профілем (так що ніяких розширень)
Ciprian Tomoiagă

1
Я натиснув кожне розширення, щоб побачити, чи є якісь згадки про блокування вмісту для конкретного веб-сайту, з яким у мене виникли проблеми. У Ghostery був запис, тому я позначив сайт як довірений, перезавантажив сторінку, і запити вдалися.
професор програмування

1
Дякую! Я також виявив розширення Project Insight, яке дає огляд дозволів усіх розширень. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă

1
@awendt Oof. Позиція конфіденційності для мене також. Дякую.
Джейсон Ліч


12

Якщо у вас немає "справжнього" сертифіката (і, таким чином, ви використовуєте самопідписаний), у FireFox ви можете перейти до:

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

Там заповніть місце, наприклад: https: //wwww.myserver: myport


це працювало для мене, коли мій 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 років потому.
Søren Mortensen

3

Просто додайте

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

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


Це добре, якщо ви хочете встановити його для прийому запитів з будь-якого місця; не добре, якщо ви цього не зробите, у чому вся суть заголовка.
Godwhacker

2

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

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

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


1

Спробуйте це, це повинно вирішити вашу проблему

  1. У свою config.php додайте www попередньо у свій 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 і повертає статус XHR, не виводячи попереджень на консоль javascript, тоді як для інших подібних збоїв він хоч щось скаже. Ай-ай.


1
Здається, схема очікується, дивлячись на приклади на w3.org/TR/cors, але все-таки дякую, я теж робив неправильну справу, і так, повідомлення про помилку Firefox відсутнє.
Річард Грін

1

Для налагодження перевірте журнали серверів, якщо це можливо. Firefox повертає помилки CORS в консолі з цілого ряду причин.

Однією з причин також є плагін uMatrix (і я думаю, що NoScript і подібні).


0

Я зіткнувся з подібною проблемою, і я думаю, що це дійсно, щоб зареєструватись, як я її виправив:

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

Мій API API очікує парами формату Json, а також поверне відповідь формату Json

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

Але, навіть, така ж розчарована помилка !!!

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

Щоб досягти цього, мені довелося налаштувати обидва, GoLang та JavaScript, щоб використовувати GET! Як тільки це зроблено, для мене більше не запитується запит на перехресне походження !!!

Сподіваюся, що це допомагає

PS:

Я використовую apache та Vhost, в каталозі Block у мене є

  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.

Відключення його або видалити плагін повинен це виправити.

У вашому випадку це може бути не adblocker, а інший плагін 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 буде витрачена досить швидко.

Звичайно, у нас немає кінця тим, що ми можемо зробити, як, наприклад, внесення даних у таблицю, надсилання в базу даних тощо.


Будь ласка, не публікуйте однакову відповідь не один раз. І будь ласка, будьте впевнені, ваша відповідь справді відповідає на питання. Якщо вам потрібно направити когось десь для отримання додаткової інформації, це не гарна відповідь.
еліксинід

Привіт, я використав посилання, оскільки в ньому є додаткова інформація, як попередні реквізити тощо. Якщо ви відчуваєте її відповідною, я її зніму.
Сувора Мехта
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.