Originea null nu este permisă de Access-Control-Allow-Origin (Programare, Javascript, Null, Xmlhttprequest, Cors, Localhost)

dudledok a intrebat.

Am făcut un mic fișier xslt pentru a crea un output html numit weather.xsl cu codul următor:

<!-- DWXMLSource="http://weather.yahooapis.com/forecastrss?w=38325&u=c" -->
<xsl:stylesheet version="1.0"
xmlns_xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="yweather"
xmlns_yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns_geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <img src="{/*/*/item/yweather:condition/@text}.jpg"/>
</xsl:template>
</xsl:stylesheet>

Vreau să încarc ieșirea html într-un div dintr-un fișier html, ceea ce încerc să fac folosind jQuery, după cum urmează:

<div id="result">
<script type="text/javascript">
$('#result').load('weather.xsl');
</script>
</div>

Dar primesc următoarea eroare: Origin null is not allowed by Access-Control-Allow-Origin.

Am citit despre adăugarea unui antet la xslt, dar nu sunt sigur cum să fac asta, așa că orice ajutor ar fi apreciat, iar dacă încărcarea în ieșire html nu se poate face în acest mod, atunci un sfat despre cum să fac altfel ar fi minunat.

Comentarii

  • Este acesta real load apel? Nu există nicio cale de acces? –  > Por T.J. Crowder.
  • Pentru a permite paginilor locale/fișierelor html (Origin: null) din sistemul de fișiere să acceseze resurse externe (origini diferite), aceste resurse externe ar trebui să răspundă cu "Access-Control-Allow-Origin": "*" în antetul de răspuns. –  > Por Maksim Shamihulau.
7 răspunsuri
T.J. Crowder

Origine null este sistemul de fișiere local, deci asta sugerează că încărcați pagina HTML care face load apel prin intermediul unui file:/// URL (de exemplu, doar făcând dublu clic pe ea într-un browser de fișiere locale sau similar). Diferite browsere au abordări diferite în ceea ce privește aplicarea aceeași politică de origine la fișierele locale.

Presupun că observați acest lucru folosind Chrome. Regulile lui Chrome pentru aplicarea SOP la fișierele locale sunt foarte stricte, nepermițând chiar și încărcarea fișierelor din același director ca și documentul. La fel face și Opera. Unele alte browsere, cum ar fi Firefox, permit accesul limitat la fișierele locale. Dar, practic, utilizarea ajax cu resurse locale nu va funcționa între browsere.

Dacă testați doar ceva local pe care îl veți implementa cu adevărat pe web, mai degrabă decât să folosiți fișiere locale, instalați un server web simplu și testați prin intermediul http:// URL-uri. Acest lucru vă oferă o imagine de securitate mult mai precisă.

Comentarii

  • După ce îl încarc, nu mai primesc Origin null, dar încă primesc „not allowed by Access-Control-Allow-Origin”. –  > Por dudledok.
  • În cazul în care resursa pe care o încărcați este așa cum ați arătat ($('#result').load('weather.xsl');), acest lucru nu ar trebui să se întâmple, deoarece solicitarea este în mod clar către aceeași origine. Dacă încercați să încărcați din altă parte (de ex, $('#result').load('http://somewhere.else/weather.xsl');), atunci vă confruntați din nou cu SOP, dar într-un mod diferit. Solicitările Ajax sunt restricționate la aceeași origine (a se vedea linkul din răspuns), sau dacă utilizați un CORS-și serverul suportă CORs, serverul poate alege dacă permite sau nu solicitarea cross-origin. –  > Por T.J. Crowder.
  • Am schimbat url-ul de încărcare. Schimbându-l înapoi la cel din întrebare, se încarcă bine. Vă mulțumim pentru ajutor –  > Por dudledok.
  • Care este cea mai simplă și mai rapidă modalitate de a configura un server web simplu? Ar fi IIS cea mai simplă cale aici? –  > Por Ciaran Gallagher.
  • @CiaranG Am rulat python -m SimpleHTTPServer dintr-o linie de comandă și apoi am mers la localhost:8000, a funcționat pentru mine. Python vine preinstalat cu Mac OS X; este posibil să fie nevoie să instalați dacă folosiți un alt sistem de operare. –  > Por Dave Liepmann.
Gokhan Tank

Chrome și Safari au o restricție privind utilizarea ajax cu resurse locale. De aceea se aruncă o eroare de genul

Originea null nu este permisă de Access-Control-Allow-Origin.

Soluție: Nu este nevoie de o adresă de e-mail: Folosiți Firefox sau încărcați datele pe un server temporar. Dacă doriți totuși să utilizați Chrome, porniți-l cu opțiunea de mai jos;

--allow-file-access-from-files

Mai multe informații despre cum să adăugați parametrul de mai sus la Chrome: Faceți clic dreapta pe pictograma Chrome din bara de activități, faceți clic dreapta pe Google Chrome în fereastra pop-up și faceți clic pe proprietăți și adăugați parametrul de mai sus în interiorul casetei de text Target din fila Shortcut. Acesta va fi ca mai jos;

C:UsersXXX_USERAppDataLocalGoogleChromeApplicationchrome.exe --allow-file-access-from-files

Sper că vă va fi de ajutor!

Comentarii

    20

  • În Mac OS X, puteți porni Chrome cu această opțiune deschizând un terminal și tastând: /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --allow-file-access-from-files & Rețineți că &amp final; este doar pentru a putea continua să folosiți terminalul și nu este necesar. NOTĂ: Dacă închideți terminalul, se va închide și fereastra Chrome. –  > Por Bruno Bernardino.
  • Am făcut toate astea, am închis și am deschis. încă nu merge (Chrome 27.0.1453.116 m pe XP) – –  > Por mplungjan.
  • Nu reușesc să adaug acest parametru sub Windows 8…, știe cineva care știe cum să facă asta?…. –  > Por Morty.
  • I sunt rulează de pe un server web. Ce naiba? Cum pot să-mi dau seama unde încarcă fișierele locale? –  > Por Andy.
  • Când încerc să adaug –allow-file-access-from-files la calea țintă primesc un mesaj „….invalid”, este această soluție încă valabilă? –  > Por alex.
gozzilli

Am vrut doar să adaug că răspunsul „rulează un server web” pare destul de descurajator, dar dacă aveți python pe sistem (instalat implicit cel puțin pe MacOS și pe orice distribuție Linux) este la fel de simplu ca:

python -m http.server  # with python3

sau

python -m SimpleHTTPServer  # with python2

Deci, dacă aveți fișierul html myfile.html într-un dosar, să zicem mydir, tot ce trebuie să faceți este:

cd /path/to/mydir
python -m http.server  # or the python2 alternative above

Apoi îndreptați-vă browserul către:

http://localhost:8000/myfile.html

Și ați terminat! Funcționează pe toate browserele, fără a dezactiva securitatea web, fără a permite fișiere locale sau chiar fără a reporni browserul cu opțiuni de linie de comandă.

Comentarii

  • echivalentul python 3 pe Windows este: python -m http.server [<portNo>] –  > Por Aragorn.
  • Python 3: python3 -m http.server –  > Por João Nunes.
  • Python 2 pe Linux, alegând portul 8080 (sau oricare altul pe care îl doriți): python -m SimpleHTTPServer 8080 –  > Por rodrigocfd.
orberkov

Aș dori să adaug cu umilință că, în conformitate cu această sursă SO: https://stackoverflow.com/a/14671362/1743693, acest tip de probleme este acum parțial rezolvată pur și simplu prin utilizarea următoarei instrucțiuni jQuery:

<script> 
    $.support.cors = true;
</script>

Am încercat-o pe IE10.0.9200, și a funcționat imediat (folosind jquery-1.9.0.js).

Pe Chrome 28.0.1500.95 – această instrucțiune nu funcționează (acest lucru se întâmplă peste tot, așa cum se plânge David în comentariile de la link-ul de mai sus)

Rularea chrome cu –allow-file-acces-from-files nu a funcționat pentru mine (așa cum susține Maistora mai sus)

Saurabh

Adăugarea unui pic pentru a folosi soluția lui Gokhan pentru a folosi:

--allow-file-access-from-files

Acum trebuie doar să adăugați textul de mai sus în Textul țintă urmat de un spațiu. asigurați-vă că închideți toate instanțele browserului Chrome după adăugarea proprietății de mai sus. acum reporniți Chrome prin pictograma unde ați adăugat această proprietate. ar trebui să funcționeze pentru toți.

Comentarii

  • Parametrul a fost deja prezentat de Ghokan Tank și aflarea modului de a avea întotdeauna browserul să înceapă cu acest parametru nu face parte din întrebare. În plus, nu puteți presupune că toată lumea folosește Microsoft Windows. –  > Por jnns.
Louis Loudog Trottier

Căutam o soluție pentru a face o cerere XHR către un server dintr-un fișier html local și am găsit o soluție folosind Chrome și PHP. (fără Jquery)

Javascripts:

var x = new XMLHttpRequest(); 
if(x) x.onreadystatechange=function(){ 
    if (x.readyState === 4 && x.status===200){
        console.log(x.responseText); //Success
    }else{ 
        console.log(x); //Failed
    }
};
x.open(GET, 'http://example.com/', true);
x.withCredentials = true;
x.send();

Antetul de cerere al lui Chrome Origin: null

Antetul meu de răspuns din PHP (Rețineți că ‘null’ este un șir de caractere). HTTP_REFERER permite originea încrucișată de la un server la distanță la altul.

header('Access-Control-Allow-Origin: '.(trim($_SERVER['HTTP_REFERER'],'/')?:'null'),true);
header('Access-Control-Allow-Credentials:true',true);

Am reușit să mă conectez cu succes la serverul meu.Puteți să nu țineți cont de anteturile Credentials, dar acest lucru funcționează pentru mine cu Apache’s AuthType Basic activat

Am testat compatibilitatea cu FF și Opera, Funcționează în multe cazuri, cum ar fi:

De la un IP LAN al unei mașini virtuale (192.168.0.x) înapoi la IP-ul WAN (public) al mașinii virtuale (port).
De la un IP LAN VM înapoi la un nume de domeniu al unui server la distanță.
de la un fișier .HTML local la IP-ul LAN VM și/sau IP:port VM WAN,
De la un fișier .HTML local la un nume de domeniu al serverului la distanță.
Și așa mai departe.

Rich

Puteți încărca un fișier Javascript local (în arborele de sub fișierul dvs. file:/ pagina sursă) folosind tag-ul source:

<script src="my_data.js"></script>

Dacă vă codificați datele de intrare în Javascript, ca în acest caz:

mydata.js:

$xsl_text = "<xsl:stylesheet version="1.0" + ....

(acest lucru este mai ușor pentru json), atunci aveți „datele” într-o variabilă globală Javascript pe care o puteți utiliza după cum doriți.