Ошибка XmlHttpRequest: нулевой источник не разрешен Access-Control-Allow-Origin - PullRequest
528 голосов
/ 29 августа 2010

Я разрабатываю страницу, которая извлекает изображения из Flickr и Panoramio через поддержку JJuery AJAX.

Сторона Flickr работает нормально, но когда я пытаюсь $.get(url, callback) из Panoramio, я вижу ошибку в консоли Chrome:

XMLHttpRequest не может загрузить http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150. Нулевой источник не разрешен Access-Control-Allow-Origin.

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

Google не обнаружил никаких полезных совпадений в сообщении об ошибке .

EDIT

Вот пример кода, который показывает проблему:

$().ready(function () {
  var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=processImages&minx=-30&miny=0&maxx=0&maxy=150';

  $.get(url, function (jsonp) {
    var processImages = function (data) {
      alert('ok');
    };

    eval(jsonp);
  });
});

Вы можете запустить пример в режиме онлайн .

РЕДАКТИРОВАТЬ 2

Спасибо Дарину за помощь в этом. ВЫШЕ КОД НЕПРАВИЛЬНО. Используйте вместо этого:

$().ready(function () {
  var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&minx=-30&miny=0&maxx=0&maxy=150&callback=?';

  $.get(url, function (data) {
    // can use 'data' in here...
  });
});

Ответы [ 16 ]

1 голос
/ 16 августа 2013

В качестве последнего примечания в документации Mozilla явно сказано , что

В приведенном выше примере произойдет сбой, если заголовок будет подстановочным символом: Access-Control-Allow-Origin:*. Поскольку Access-Control-Allow-Origin явно упоминает http://foo.example, контент, удостоверяющий полномочия, возвращается в вызывающий веб-контент.

Как следствие, это не простоплохая практика использовать '*'.Просто не работает:)

1 голос
/ 02 апреля 2012

Я использую сервер Apache, поэтому я использовал модуль mod_proxy.Включите модули:

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Затем добавьте:

ProxyPass /your-proxy-url/ http://service-url:serviceport/

Наконец, передайте proxy-url в ваш скрипт.

0 голосов
/ 21 августа 2014

Люди,

Я столкнулся с подобной проблемой. Но с помощью Fiddler я смог разобраться в проблеме. Проблема заключается в том, что URL-адрес клиента, настроенный в реализации CORS на стороне веб-API, не должен иметь косую черту в конце. После отправки запроса через Google Chrome и проверки вкладки TextView раздела Fiddler Заголовки сообщение об ошибке будет выглядеть примерно так:

* "Указанный источник политики your_client_url: / 'недопустим. Он не может заканчиваться косой чертой."

Это очень странно, потому что он работал без проблем в Internet Explorer, но доставлял мне головную боль при тестировании с использованием Google Chrome.

Я удалил косую черту в коде CORS и перекомпилировал Web API, и теперь API доступен через Chrome и Internet Explorer без каких-либо проблем. Пожалуйста, сделайте это.

Спасибо, Andy

0 голосов
/ 10 июля 2014

Убедитесь, что вы используете последнюю версию JQuery.Мы столкнулись с этой ошибкой для JQuery 1.10.2, и ошибка была устранена после использования JQuery 1.11.1

0 голосов
/ 30 сентября 2013

Я также получил ту же ошибку в Chrome (я не тестировал другие браузеры). Это было связано с тем, что я перешел на domain.com вместо www.domain.com. Немного странно, но я мог бы решить эту проблему, добавив следующие строки в .htaccess. Он перенаправляет domain.com на www.domain.com, и проблема была решена. Я - ленивый посетитель сети, поэтому почти никогда не набираю www, но, по-видимому, в некоторых случаях это требуется.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
0 голосов
/ 07 июня 2013

Существует небольшая проблема в решении, опубликованном CodeGroover выше , где, если вы измените файл, вам придется перезапустить сервер, чтобы фактически использовать обновленный файл (по крайней мере, в моем случае).

Итак, немного поискив, я нашел этот Для использования:

sudo npm -g install simple-http-server # to install
nserver # to use

И тогда он будет работать на http://localhost:8000.

...