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...
});
});
16 answers
Dla przypomnienia, o ile mogę powiedzieć, miałeś dwa problemy:
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łówekAccess-Control-Allow-Origin
.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łówkaOrigin
. Jednak adresy URLfile://
wytwarzają nullOrigin
, 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:
- jeśli próbujesz użyć JSONP, upewnij się, że jedna z poniższych sytuacji:
- używasz
$.get
i ustawiaszdataType
dojsonp
. - używasz
$.getJSON
i umieszczaszcallback=?
w adresie URL.
- używasz
- jeśli próbujesz zrobić cross-domain XMLHttpRequest via CORS...
- upewnij się, że testujesz przez
http://
. Skrypty uruchamiane przezfile://
mają ograniczone wsparcie dla CORS. - upewnij się, że przeglądarka rzeczywiście obsługuje CORS . (Opera i Internet Explorer spóźniają się na imprezę)
- upewnij się, że testujesz przez
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).
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.
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.
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.
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.
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.
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
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.
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;
});
}
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.
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:)
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]
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
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
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
.
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