Origin null не дозволяється Access-Control-Allow-Origin


184

Я створив невеликий файл xslt, щоб створити вихід HTML під назвою weather.xsl з кодом наступним чином:

<!-- 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>

Я хочу завантажити з виводу HTML в div у файл html, який я намагаюся зробити за допомогою jQuery наступним чином:

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

Але я отримую таку помилку: Null Origin не дозволено Access-Control-Allow-Origin.

Я читав про додавання заголовка до xslt, але не знаю, як це зробити, тому будь-яка допомога буде вдячна, і якщо завантаження в html вихід не може бути виконано таким чином, то поради щодо того, як ще зробити це було б чудово.


Це ваш фактичний load дзвінок? На ньому взагалі немає шляху?
TJ Crowder

Відповіді:


227

Origin null- це локальна файлова система, тому пропонується завантажувати HTML-сторінку, яка здійснює loadдзвінок за file:///URL-адресою (наприклад, лише двічі клацнувши її в локальному файловому браузері чи подібній). Різні браузери застосовують різні підходи до застосування тієї ж політики оригіналу до локальних файлів.

Я думаю, що ви бачите це за допомогою Chrome. Правила Chrome щодо застосування SOP до локальних файлів дуже чіткі, це дозволяє навіть завантажувати файли з того самого каталогу, що і документ. Так само і Опера. Деякі інші браузери, наприклад Firefox, дозволяють обмежувати доступ до локальних файлів. Але в основному використання ajax з локальними ресурсами не працюватиме крос-браузером.

Якщо ви просто тестуєте щось місцеве, що ви дійсно розгортаєтесь в Інтернеті, а не використовуєте локальні файли, встановіть простий веб-сервер і протестуйте через http://URL-адреси. Це дає вам набагато більш точну картину безпеки.


1
Після того як я завантажую його, я більше не отримую значення Origin null, але все одно отримую "заборонено Access-Control-Allow-Origin".
дудледок

3
Якщо ресурс, який ви завантажуєте, такий, як ви показали ( $('#result').load('weather.xsl');), цього не повинно статися, оскільки запит явно того самого походження. Якщо ви намагаєтеся завантажити з іншого місця (наприклад, $('#result').load('http://somewhere.else/weather.xsl');), то ви знову запускаєтесь у SOP, але по-іншому. Запити Ajax обмежені тим самим походженням (див. Посилання у відповідь), або якщо ви використовуєте браузер з підтримкою CORS і сервер підтримує COR, сервер може вибрати, чи дозволити запит перехресного походження.
TJ Crowder

Я змінив URL-адресу завантаження. Якщо повернути його до того, що йдеться у запитанні, це призведе до завантаження. Дякую за допомогу
dudledok

2
Який найпростіший, швидкий спосіб налаштувати простий веб-сервер? Чи був би IIS найпростішим способом тут?
Ciaran Gallagher

13
@CiaranG Я біг python -m SimpleHTTPServerз командного рядка, а потім перейшов до localhost: 8000, працював на мене. Python попередньо встановлений з Mac OS X; можливо, вам доведеться встановити, якщо ви використовуєте іншу ОС.
Дейв Ліпманн

216

Chrome і Safari мають обмеження щодо використання ajax з локальними ресурсами. Ось чому це кидання помилки на кшталт

Origin null не дозволяється Access-Control-Allow-Origin.

Рішення: Використовуйте firefox або завантажуйте свої дані на тимчасовий сервер. Якщо ви все ще хочете використовувати Chrome, почніть його з наведеної нижче опції;

--allow-file-access-from-files

Докладніше про те, як додати вищевказаний параметр у ваш Chrome: Клацніть правою кнопкою миші значок Chrome на панелі завдань, клацніть правою кнопкою миші на Google Chrome у спливаючому вікні та клацніть властивості та додайте зазначений вище параметр у текстове поле "Ціль" на вкладці "Ярлик". Сподобається, як нижче;

C:\Users\XXX_USER\AppData\Local\Google\Chrome\Application\chrome.exe --allow-file-access-from-files

Сподіваюся, це допоможе!


19
У Mac OS X ви можете запустити Chrome за допомогою цієї опції, відкривши термінал і ввівши: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --allow-file-access-from-files & Зауважте, що фінал & просто так, щоб ви могли продовжувати використовувати термінал, і це не потрібно. ПРИМІТКА. Якщо закрити термінал, він закриє вікно Chrome.
Бруно Бернардіно

3
Зробив усе це і закрив і відкрив. досі не йде (Chrome 27.0.1453.116 м на XP)
mplungjan

Я не в змозі додати цей параметр під Windows 8 ..., хто знає, як це зробити? ...
Морті

Я буду працює з веб - сервера. Якого біса? Як я можу зрозуміти, де він завантажує локальні файли?
Енді

Коли я намагаюся додати --allow-file-access-from-files до цільового шляху, я отримую повідомлення ".... недійсне", чи дійсне htis рішення?
алекс

48

Просто хотілося додати, що відповідь "запустити веб-сервер" здається досить непростим, але якщо у вас у вашій системі встановлений python (встановлений за замовчуванням хоча б на MacOS та будь-якому дистрибутиві Linux), це так просто:

python -m http.server  # with python3

або

python -m SimpleHTTPServer  # with python2

Отже, якщо у вас є файл html myfile.htmlу папці, скажімо mydir, все, що вам потрібно зробити, це:

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

Потім вкажіть браузер на:

http://localhost:8000/myfile.html

І ви зробили! Працює у всіх веб-переглядачах , не вимикаючи безпеку веб-сторінок, дозволяючи локальні файли або навіть перезавантажуючи браузер з параметрами командного рядка.


2
python 3 еквівалентом для Windows є: python -m http.server [<portNo>]
Aragorn

Python 3: python3 -m http.server
Жоао Нунес

Python 2 на Linux, вибравши порт 8080 (або будь-який інший, який ви хочете):python -m SimpleHTTPServer 8080
Родріго,

2

Я хотів би покірно додати, що згідно з цим джерелом SO: https://stackoverflow.com/a/14671362/1743693 , ця проблема зараз частково вирішується просто за допомогою наступної інструкції jQuery:

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

Я спробував це на IE10.0.9200, і він працював негайно (використовуючи jquery-1.9.0.js).

Щодо хрома 28.0.1500.95 - ця інструкція не працює (це трапляється повсюдно, як Девід скаржиться в коментарях за посиланням вище)

Запуск хрому за допомогою --allow-file-access-from-files не працював для мене (як твердження Maistora вище)


2

Додавання трохи для використання рішення Gokhan для використання:

--allow-file-access-from-files

Тепер вам просто потрібно додати верхній текст у тексті цілі, після чого пробіл. переконайтеся, що ви закрили всі екземпляри хромованого браузера після додавання вищевказаної властивості. Тепер перезапустіть хром значком, де ви додали цю властивість. Це має працювати для всіх.


Параметр вже був представлений Ghokan Tank, і дізнатися, як завжди запускати браузер із цього параметра, не є частиною питання. Крім того, ви не можете припустити, що всі користуються Microsoft Windows.
jnns

0

Я шукав рішення, як зробити запит XHR на сервер із локального html-файлу, і знайшов рішення за допомогою Chrome та PHP. (без 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();

Заголовок мого Chrome Origin: null

Мій заголовок відповіді PHP (зауважте, що "null" - це рядок ). HTTP_REFERER дозволяють перехрещувати походження з віддаленого сервера на інший.

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

Мені вдалося успішно підключитися до свого сервера. Ви можете ігнорувати заголовки Credentials, але це працює для мене з AuthType Basicувімкненим Apache

Я перевірив сумісність з FF і Opera. Він працює у багатьох випадках, таких як:

Від IP-адреси VM LAN (192.168.0.x) назад до WM WAN (загальнодоступний) IP: порт
Від IP-адреси VM LAN назад до доменного імені віддаленого сервера.
Від локального .HTML-файла до IP-адреси VM LAN та / або VM WAN IP: порт,
Від локального .HTML-файла до доменного імені віддаленого сервера.
І так далі.


0

Ви можете завантажити локальний файл Javascript (у дереві під file:/початковою сторінкою), використовуючи тег джерела:

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

Якщо ви кодуєте свій вхід у Javascript, як у цьому випадку:

mydata.js :

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

(це простіше для json), тоді ви маєте свої дані у глобальній змінній Javascript, яку можна використовувати за своїм бажанням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.