Klaida XmlHttpRequest: Null kilmė neleidžiama Access-Control-Allow-Origin

Aš kuriu puslapį, kuris atkuria vaizdus iš „Flickr“ ir „Panoramio“ per „jQuery AJAX“ palaikymą.

„Flickr“ pusė puikiai veikia, bet kai bandau $.get(url, callback) iš „Panoramio“, „Chrome“ konsolėje matau klaidą:

XMLHttpRequest negali atsisiųsti http://www.panoramio.com/wapi/data/get_photos?v=1> . Neleistina kilmė neleidžiama naudojant „Access-Control-Allow-Origin“.

Jei tiesiai prašau šio URL iš naršyklės, jis veikia gerai. Kas vyksta ir ar galiu tai apeiti? Ar aš neteisingai pateikiu užklausą arba tai, ką daro „Panoramio“, kad trukdytų tai, ką bandau daryti?

„Google“ nerodė jokių naudingų atitikmenų pranešime.

PAKEITIMAS

Štai pavyzdinis kodas, rodantis problemą:

 $().ready(function () { var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1 $.get(url, function (jsonp) { var processImages = function (data) { alert('ok'); }; eval(jsonp); }); }); 

Galite paleisti mėginį internete .

EDIT 2

Ačiū Darinui už jo pagalbą. NUTRAUKIMO KODAS KLAIDA. Vietoj to naudokite:

 $().ready(function () { var url = 'http://www.panoramio.com/wapi/data/get_photos?v=1 $.get(url, function (data) { // can use 'data' in here... }); }); 
504
29 авг. Drew Noakes nustatė 29 rug. 2010-08-29 19:12 '10, 19:12, 2010-08-29 19:12
@ 16 atsakymų

Dėl įrašo, kiek galiu pasakyti, jūs turėjote dvi problemas:

  • „Jsonp“ tipo specifiką neperdavote prie „ $.get .get“, todėl jis naudojo paprastą XMLHttpRequest. Tačiau jūsų naršyklė palaiko „Cross-Origin CORS“ (išteklių dalijimąsi), kad leistų tarpvalstybiniam XMLHttpRequest, jei serveris jį patvirtino. Čia yra Access-Control-Allow-Origin antraštė.

  • Manau, jūs minėjote, kad jį naudojate iš failo: // URL. CORS antraštėms yra du būdai nurodyti, kad XHR yra gerai. Vienas iš jų yra siųsti „ Access-Control-Allow-Origin: * (kuris, jei pasiekėte „Flickr“ per $.get , jie turėjo padaryti), o kitas turėjo sekti „ Origin antraštės turinį. Tačiau file:// URL sukuria Origin , kurios negalima išspręsti atkuriant atgal.

Pirmasis buvo išspręstas žiediniu keliu Darino pasiūlymu naudoti $.getJSON . Jei norite pakeisti užklausos tipą iš savo numatytojo „json“ į „jsonp“, atsiranda šiek tiek magija, jei jis mato antraštės callback=? url.

Tai nusprendė antrą kartą, nebandydama atlikti CORS užklausos file:// URL.

Jei norite paaiškinti kitiems žmonėms, vadovaukitės šiomis paprastomis trikčių šalinimo instrukcijomis:

  • Jei bandote naudoti JSONP, įsitikinkite, kad vienas iš šių veiksmų:
    • Naudojate $.get ir nustatykite jsonp į jsonp .
    • Ar naudojate $.getJSON ir įjunkite callback=? url.
  • Jei bandote atlikti kryžminį domeną XMLHttpRequest per CORS ...
    • Įsitikinkite, kad bandote per http:// . Skriptai, kuriuose veikia file:// turi ribotą paramą CORS.
    • Įsitikinkite, kad naršyklė iš tikrųjų palaiko CORS . („Opera“ ir „Internet Explorer“ partijai vėluoja)
407
19 сент. atsakymas duotas ssokolow rugsėjo 19 d 2010-09-19 09:06 '10, 9:06, 2010-09-19 09:06

Į savo skambučio scenarijų reikia pridėti HEADER, ką turėjau daryti PHP:

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

Skaityti daugiau „ Cross Domain AJAX ou“ paslaugose „WEB“ (prancūzų kalba).

73
11 февр. Atsakyti Thomas Decaux vasario 11 d 2011-02-11 13:59 '11, 13:59 pm. 2011-02-11 13:59

Paprastam HTML projektui:

 cd project python -m SimpleHTTPServer 8000 

Tada naršykite failą.

66
07 марта '12 в 18:49 2012-03-07 18:49 atsakymą pateikė „ CodeGroover“ kovo 7 d. 12 d. 18:49 PM 2012-03-07 18:49

Dirba man „Google Chrome“ v5.0.375.127 (gaunu įspėjimą):

 $.get('http://www.panoramio.com/wapi/data/get_photos?v=1 function(json) { alert(json.photos[1].photoUrl); }); 

Aš taip pat rekomenduoju naudoti $.getJSON() metodą, nes ankstesnis $.getJSON() IE8 (bent jau ant mano įrenginio)

 $.getJSON('http://www.panoramio.com/wapi/data/get_photos?v=1 function(json) { alert(json.photos[1].photoUrl); }); 

Čia galite pabandyti internete .


UPDATE:

Dabar, kai parodėte savo kodą, aš su juo susiduriu su problema. Turite anoniminę funkciją ir įmontuotą funkciją, tačiau abu bus vadinami processImages . Tai veikia „JQuery“ palaikymo JSONP. Atkreipkite dėmesį, kaip apibrėžiu callback=? todėl galite naudoti anoniminę funkciją. Apie jį galite skaityti dokumentuose .

Dar viena pastaba: neturėtumėte skambinti eval. Jūsų anoniminei funkcijai perduotas parametras jau bus analizuojamas JSON naudojant jQuery.

19
29 авг. atsakymą pateikė Darin Dimitrov 29 rug. 2010-08-29 19:14 '10, 19:14, 2010-08-29 19:14

Jei prašomas serveris palaiko JSON duomenų formatą, naudokite JSONP sąsają (JSON Padding). Tai leidžia jums pateikti užklausas į išorinį domeną be tarpinio serverio ar išgalvotų antraštių.

8
06 мая '11 в 19:27 2011-05-06 19:27 atsakymą pateikė Cheng Chen gegužės 06 d. 11 val. 19:27 2011-05-06 19:27

Su juo susidorojome per http.conf failą (redaguota ir iš naujo paleista HTTP paslauga):

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

Header set Access-Control-Allow-Origin "*" galite nurodyti tikslų URL.

5
29 июля '11 в 21:58 2011-07-29 21:58 atsakymas pateikiamas romu31 liepos 29 d. 11 val. 21:58 2011-07-29 21:58

Jei naudojate vietinį testavimą arba skambinate failu, panašiu į file:// , turite išjungti naršyklės apsaugą.

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

4
20 авг. atsakymą pateikė user2701060 20 rug . 2013-08-20 21:35 '13, 21:35 2013-08-20 21:35

Tai ta pati kilmės politika , turite naudoti JSON-P sąsają arba tarpinį serverį, veikiantį tame pačiame kompiuteryje.

4
29 авг. Atsakymas pateikiamas Quentin 29 rug. 2010-08-29 19:15 '10, 19:15, 2010-08-29 19:15

Mano atveju, tas pats kodas veikė „Firefox“, bet „Google Chrome“. „Google Chrome“ konsolė „Google“ sakė:

 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" 

Turėjau atsisakyti „Ajax“ URL www dalies, kad ji teisingai atitiktų pradinį URL, ir tada ji gerai veikė.

3
03 янв. atsakymas pateikiamas Kalpesh Patel 03 jan. 2012-01-03 22:09 '12 10:09 val. 2012-01-03 22:09

Ne visi serveriai palaiko jsonp. Tam reikia serverio nustatyti atgalinio ryšio funkciją. Aš naudoju jį, kad gautumėte „Json“ atsakymus iš svetainių, kuriose grįžta grynasis „Json“, bet nepalaiko „jsonp“:

 function AjaxFeed(){ return $.ajax({ url: 'http://somesite.com/somejsonfile.php', data: {something: true}, dataType: 'jsonp',  contentType: 'application/json', }); } function GetData() { AjaxFeed()  .done(function(data){ return data; })  .fail(function(jqXHR) {  var data = jQuery.parseJSON(jqXHR.responseText); return data; }); } 
2
19 окт. atsakymas duotas mAsT3RpEE 19 okt. 2013-10-19 16:32 '13, 16:32 2013-10-19 16:32

Kaip paskutinę pastabą, Mozilla dokumentuose tai aiškiai nurodoma

Anksčiau pateiktas pavyzdys nepavyko, jei antraštė buvo pakaitos simbolis: „ Access-Control-Allow-Origin“: *. Kadangi „Access-Control-Allow-Origin“ aiškiai nurodo http: //foo.example , patikimumo informacijos turinys grąžinamas į skambinančiojo interneto svetainės turinį.

Todėl tai ne tik bloga „*“ naudojimo praktika. Tiesiog neveikia :)

1
16 авг. atsakymas, kurį pateikė user2688838 16 rug . 2013-08-16 12:11 '13, 12:11 2013-08-16 12:11

Aš naudoju „Apache“ serverį, todėl naudoju mod_proxy modulį. Įgalinti modulius:

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

Tada pridėkite:

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

Galiausiai persiųskite tarpinį URL į savo scenarijų.

1
02 апр. atsakymas pateikiamas zenio 02 balandis 2012-04-02 14:52 '12 at 14:52 pm 2012-04-02 14:52

Žmonės

Turėjau panašią problemą. Bet naudojant Fiddler, galėjau suprasti šią problemą. Problema ta, kad kliento URL, kuris yra sukonfigūruotas CORS diegime žiniatinklio API pusėje, neturėtų turėti galinio brūkšnio. Kai pateiksite užklausą per „Google Chrome“ ir peržiūrėsite „ TextView“ skirtuką „Fiddler“ antraštių skyriuje, klaidos pranešimas pasakys kažką panašaus:

* "Nurodyta politinė jūsų_client_url: / 'kilmė negalioja. Ji negali baigtis brūkšniu."

Tai yra tikras išblukimas, nes jis veikė be jokių problemų „Internet Explorer“, tačiau bandant naudojant „Google Chrome“ turėjau galvos skausmą.

Aš pašalinau slankiklį į CORS kodą ir perkompiliuotu žiniatinklio API, ir dabar API yra be jokių problemų „Chrome“ ir „Internet Explorer“. Prašome tai padaryti.

Ačiū, Andy

0
21 авг. Andymenono atsakymas, rugpjūčio 21 d. 2014-08-21 08:18 '14, 8:18 val. 2014-08-21 08:18

„Chrome“ taip pat gavau tą pačią klaidą (aš netikrinau kitų naršyklių). Taip buvo dėl to, kad aš perėjo prie domeno.com vietoj www.domain.com. Šiek tiek keista, bet galėčiau išspręsti šią problemą pridedant šias eilutes .htaccess. Jis nukreipia domeną.com į www.domain.com ir problema išspręsta. Aš esu tingus žiniatinklio lankytojas, todėl beveik niekada nekuriu www, bet kai kuriais atvejais tai atrodo reikalinga.

 RewriteEngine on RewriteCond %{HTTP_HOST} ^domain\.com$ [NC] RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L] 
0
30 сент. Atsakymas pateikiamas mslembro rugsėjo 30 d 2013-09-30 10:47 '13, 10:47, 2013-09-30 10:47

Yra maža problema, susijusi su „ CodeGroover“ paskelbtu sprendimu, kuriame, jei pakeisite failą, turėsite iš naujo paleisti serverį, kad iš tikrųjų būtų naudojamas atnaujintas failas (bent jau mano atveju).

Todėl ieškodamas šiek tiek:

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

Ir tada jis veiks http://localhost:8000 .

0
07 июня '13 в 2:15 2013-06-07 02:15 Atsakymą pateikė MiJyn birželio 7 d. 13 d. 2:15 2013-06-07 02:15

Įsitikinkite, kad naudojate naujausią „jQuery“ versiją. Susidūrėme su jQuery 1.10.2 klaida, o klaida buvo išspręsta naudojant jQuery 1.11.1

0
10 июля '14 в 9:32 2014-07-10 09:32 atsakymą pateikė „ Ganesh Kamath“ - „Code Frenzy“ liepos 10 d. 14 val.

Kiti klausimai apie „ žymas „ arba „ Užduoti klausimą“