Błąd XMLHttpRequest: Origin null nie jest dozwolone przez Access-Control-Allow-Origin

Rozwijam stronę, która pobiera obrazy z Flickr i Panoramio poprzez obsługę AJAX jQuery.

Strona Flickr działa dobrze, ale kiedy próbuję $.get(url, callback) z Panoramio, widzę błąd w konsoli Chrome:

XMLHttpRequest nie może załadować 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. Origin null nie jest dozwolone przez Access-Control-Allow-Origin.

Jeśli odpytywam ten adres URL bezpośrednio z przeglądarki, działa dobrze. Co się dzieje i mogę to obejść? Czy źle komponuję moje zapytanie, czy jest to coś, co robi Panoramio, aby utrudnić to, co próbuję zrobić?

Google nie znalazł żadnych przydatnych dopasowań na komunikat o błędzie.

EDIT

Oto przykładowy kod, który pokazuje problem:

$().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);
  });
});

Możesz uruchomić przykład online .

EDIT 2

Dzięki Darinowi za pomoc. POWYŻSZY KOD JEST BŁĘDNY. Użyj tego zamiast:
$().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...
  });
});
Author: Kevin Christopher Henry, 2010-08-29

16 answers

Dla przypomnienia, o ile mogę powiedzieć, miałeś dwa problemy:

  1. Nie przekazywałeś do $.get specyfika typu "jsonp", więc używałeś zwykłego XMLHttpRequest. Jednak twoja przeglądarka obsługiwała CORS (Cross-Origin Resource Sharing), aby umożliwić cross-domain XMLHttpRequest, jeśli serwer go OKed. W tym miejscu pojawił się nagłówek Access-Control-Allow-Origin.

  2. Chyba wspomniałeś, że uruchamiasz go z pliku: / / URL. Istnieją dwa sposoby na nagłówki CORS sygnał, że XHR jest w porządku. Jednym z nich jest wysłanie Access-Control-Allow-Origin: * (co, jeśli docierałeś do Flickr przez $.get, musieli to robić) , podczas gdy drugim było odtworzenie zawartości nagłówka Origin. Jednak adresy URL file:// wytwarzają null Origin, którego nie można autoryzować za pomocą echo-back.

Pierwszy został rozwiązany w sposób okrężny dzięki sugestii Darina, aby użyć $.getJSON. Trochę magicznie jest zmienić typ żądania z domyślnego "json " na" jsonp", jeśli widzi podłańcuch callback=? w adresie URL.

, który rozwiązał drugi, nie próbując już wykonywać żądania Kors z adresu URL file://.

Aby wyjaśnić dla innych ludzi, oto proste instrukcje rozwiązywania problemów:

  1. jeśli próbujesz użyć JSONP, upewnij się, że jedna z poniższych sytuacji:
    • używasz $.get i ustawiasz dataType do jsonp.
    • używasz $.getJSON i umieszczasz callback=? w adresie URL.
  2. jeśli próbujesz zrobić cross-domain XMLHttpRequest via CORS...
    1. upewnij się, że testujesz przez http://. Skrypty uruchamiane przez file:// mają ograniczone wsparcie dla CORS.
    2. upewnij się, że przeglądarka rzeczywiście obsługuje CORS . (Opera i Internet Explorer spóźniają się na imprezę)
 411
Author: ssokolow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-08 16:00:16

Musisz dodać nagłówek w swoim skrypcie, oto co musiałem zrobić w PHP:

header('Access-Control-Allow-Origin: *');

Więcej szczegółów w Cross domain AJAX ou services WEB (w języku francuskim).

 74
Author: Thomas Decaux,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-23 14:17:59

Dla prostego projektu HTML:

cd project
python -m SimpleHTTPServer 8000

Następnie przejrzyj plik.

 67
Author: CodeGroover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:54:56

Działa u mnie na Google Chrome v5.0.375.127 (dostaję alert):

$.get('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150',
function(json) {
    alert(json.photos[1].photoUrl);
});

Również polecam korzystanie z $.getJSON() metoda zamiast jak poprzednia nie działa na IE8 (przynajmniej na moim komputerze):

$.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1&key=dummykey&tag=test&offset=0&length=20&callback=?&minx=-30&miny=0&maxx=0&maxy=150', 
function(json) {
    alert(json.photos[1].photoUrl);
});
Możesz spróbować[12]}online stąd[9]}.

Aktualizacja:

Teraz, gdy pokazałeś swój kod, widzę z nim problem. Masz zarówno funkcję anonimową, jak i funkcję inline, ale obie będą wywoływane processImages. Tak jQuery jest Obsługa JSONP działa. Zauważ, jak definiuję callback=?, abyś mógł używać funkcji anonimowej. Więcej na ten temat można przeczytać w dokumentacji .

Kolejna uwaga jest taka, że nie powinieneś dzwonić do evala. Parametr przekazany do funkcji anonimowej zostanie już przetworzony do JSON przez jQuery.

 20
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-29 16:55:38

Dopóki żądany serwer obsługuje format danych JSON, Użyj interfejsu JSONP (JSON Padding). Pozwala na tworzenie żądań domen zewnętrznych bez serwerów proxy lub fantazyjnych nagłówków.

 8
Author: Cheng Chen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 09:05:21

Jest to ta sama polityka pochodzenia , musisz użyć interfejsu JSON - P lub proxy działającego na tym samym hoście.

 5
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-29 16:15:25

Zarządzaliśmy nim poprzez plik http.conf (edytowany, a następnie ponownie uruchomiony serwis HTTP):

<Directory "/home/the directory_where_your_serverside_pages_is">
    Header set Access-Control-Allow-Origin "*"
    AllowOverride all
    Order allow,deny
    Allow from all
</Directory>

W Header set Access-Control-Allow-Origin "*" możesz umieścić dokładny adres URL.

 5
Author: romu31,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:53:46

Jeśli wykonujesz lokalne testy lub wywołujesz Plik z czegoś takiego jak file://, musisz wyłączyć bezpieczeństwo przeglądarki.

Na MAC: open -a Google\ Chrome --args --disable-web-security

 4
Author: user2701060,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-20 19:15:28

W moim przypadku ten sam kod działał dobrze na Firefoksie, ale nie na Google Chrome. Konsola JavaScript Google Chrome said:

XMLHttpRequest cannot load http://www.xyz.com/getZipInfo.php?zip=11234. 
Origin http://xyz.com is not allowed by Access-Control-Allow-Origin.
Refused to get unsafe header "X-JSON"

Musiałem upuścić część www adresu URL Ajax, aby pasowała poprawnie do adresu URL pochodzenia i działało dobrze wtedy.

 3
Author: Kalpesh Patel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 15:54:33

Nie wszystkie serwery obsługują jsonp. Wymaga to, aby serwer ustawił funkcję zwrotną w swoich wynikach. Używam tego, aby uzyskać odpowiedzi json ze stron, które zwracają czysty json, ale nie obsługują jsonp:

function AjaxFeed(){

    return $.ajax({
        url:            'http://somesite.com/somejsonfile.php',
        data:           {something: true},
        dataType:       'jsonp',

        /* Very important */
        contentType:    'application/json',
    });
}

function GetData() {
    AjaxFeed()

    /* Everything worked okay. Hooray */
    .done(function(data){
        return data;
    })

    /* Okay jQuery is stupid manually fix things */
    .fail(function(jqXHR) {

        /* Build HTML and update */
        var data = jQuery.parseJSON(jqXHR.responseText);

        return data;
    });
}
 2
Author: mAsT3RpEE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-16 09:10:21

Używam serwera Apache, więc użyłem modułu mod_proxy. Włącz Moduły:

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

Następnie dodaj:

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

Na koniec przekaż adres URL serwera proxy do skryptu.

 1
Author: zenio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 11:52:05

Jako ostatnia uwaga Dokumentacja Mozilli wyraźnie mówi że

Powyższy przykład nie powiedzie się, jeśli nagłówek będzie oznaczony jako: Access-Control-Allow-Origin:*. ponieważ Access-Control-Allow-Origin wyraźnie wspomina http://foo.przykład , credential-cognizant treść jest zwracana do strony wywołującej treść.

Jako konsekwencja jest nie tylko złą praktyką używania '*'. Po prostu nie działa:)

 1
Author: user2688838,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-16 09:11:13

Mam też ten sam błąd w Chrome (nie testowałem innych przeglądarek). Było to spowodowane tym, że nawigowałem na domain.com zamiast www.domain.com. trochę dziwne, ale mógłbym rozwiązać problem dodając następujące linie do .htaccess. Przekierowuje domain.com na www.domain.com i problem został rozwiązany. Jestem leniwym gościem sieci, więc prawie nigdy nie wpisuję www, ale najwyraźniej w niektórych przypadkach jest to wymagane.

RewriteEngine on
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]
 0
Author: mslembro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-30 07:47:51

Upewnij się, że używasz najnowszej wersji JQuery. Mieliśmy do czynienia z tym błędem dla JQuery 1.10.2 i błąd został rozwiązany po użyciu JQuery 1.11.1

 0
Author: Ganesh Kamath - 'Code Frenzy',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-10 06:32:30

Folks,

Natknąłem się na podobny problem. Ale używając Fiddlera, byłem w stanie dostać się do problemu. Problem polega na tym, że adres URL klienta skonfigurowany w implementacji CORS po stronie Web API nie może mieć końcowego ukośnika. Po przesłaniu żądania przez Google Chrome i sprawdzeniu zakładki TextView w sekcjiHeaders Fiddler, komunikat o błędzie brzmi następująco:

* " podana Polityka origin your_client_url: / jest nieprawidłowa. nie może zakończyć się ukośnikiem."

To naprawdę dziwne, ponieważ działało bez żadnych problemów w Internet Explorerze, ale przyprawiło mnie o ból głowy podczas testowania za pomocą Google Chrome.

Usunąłem ukośnik w kodzie CORS i przekompilowałem Web API, a teraz API jest dostępne przez Chrome i Internet Explorer bez żadnych problemów. Proszę, spróbuj.

Dzięki, Andy

 0
Author: andymenon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-21 05:18:05

Jest mały problem w rozwiązaniu zamieszczonym przez CodeGroover powyżej, gdzie jeśli zmienisz plik, będziesz musiał ponownie uruchomić serwer, aby faktycznie użyć zaktualizowanego pliku (przynajmniej w moim przypadku).

Więc szukając trochę, znalazłem ten do użycia:

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

A następnie będzie służył w http://localhost:8000.

 0
Author: MiJyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-05 23:24:49