Происхождение 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 после добавления свойства выше.
Теперь перезапустите хром с помощью значка, где вы добавили это свойство.
Он должен работать для всех.