Происхождение null не разрешено Access-Control-Allow-Origin

Я создал небольшой файл 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 не допускается через Access-Control-Allow-Origin.

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

Ответ 1

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

Я предполагаю, что вы видите это с помощью Chrome. Правила Chrome для применения SOP к локальным файлам очень жесткие, он запрещает даже загрузку файлов из того же каталога, что и документ. Так же и Opera. Некоторые другие браузеры, такие как Firefox, допускают ограниченный доступ к локальным файлам. Но в принципе, использование ajax с локальными ресурсами не будет работать в кросс-браузере.

Если вы просто проверяете что-то локально, что вы действительно будете развертывать в Интернете, а не использовать локальные файлы, установите простой веб-сервер и протестируйте с помощью URL http://. Это дает вам более точную картину безопасности.

Ответ 2

У Chrome и Safari есть ограничение на использование ajax с локальными ресурсами. Вот почему он выдавал ошибку, например

Происхождение 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

Надеюсь, это поможет!

Ответ 3

Просто хотел добавить, что ответ "запустить веб-сервер" кажется довольно сложным, но если у вас есть 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

И все готово! Работает на всех браузерах, не отключая веб-безопасность, разрешая локальные файлы или даже перезапуская браузер с параметрами командной строки.

Ответ 4

Я хотел бы смиренно добавить, что согласно этому SO-источнику: fooobar.com/questions/41642/..., эта проблема теперь частично решена просто используя следующую инструкцию jQuery:

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

Я пробовал его на IE10.0.9200, и он сразу работал (используя jquery-1.9.0.js).

На chrome 28.0.1500.95 - эта инструкция не работает (это происходит повсюду, поскольку david жалуется на комментарии по ссылке выше)

Запуск хром с -allow-file-access-from-files не работал у меня (как утверждает Майстора выше)

Ответ 5

Добавление бит для использования решения Gokhan для использования:

--allow-file-access-from-files

Теперь вам просто нужно добавить текст в текст цели, а затем пробел. убедитесь, что вы закрыли все экземпляры браузера Chrome после добавления свойства выше. Теперь перезапустите хром с помощью значка, где вы добавили это свойство. Он должен работать для всех.