Поскольку происхождение null не разрешено контроля доступа-разрешить-происхождения для file:/// на file:/// (бессерверная)


Я пытаюсь создать веб-сайт, который можно загрузить и запустить локально, запустив его индексный файл.

все файлы являются локальными, никакие ресурсы не используются в интернете.

когда я пытаюсь использовать плагин AJAXSLT для jQuery для обработки XML-файла с шаблоном XSL (в подкаталогах), я получаю следующие ошибки:

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/data/home.xml. Origin null is not allowed by Access-Control-Allow-Origin.

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/assets/xsl/main.xsl. Origin null is not allowed by Access-Control-Allow-Origin.

индексный файл делает запрос file:///C:/path/to/XSL%20Website/index.html в то время как файлы JavaScript используются хранится в file:///C:/path/to/XSL%20Website/assets/js/.

как я могу сделать, чтобы исправить эту проблему?

8 202

8 ответов:

для случаев, когда запуск локального веб-сервера не является опцией, вы можете разрешить доступ Chrome к file:// файлы через переключатель браузера. После некоторых раскопок, я нашел эта дискуссия, который упоминает переключатель браузера в открытии сообщения. Запустите свой экземпляр Chrome с:

chrome.exe --allow-file-access-from-files

это может быть приемлемо для среды разработки, но мало что еще. вы, конечно, не хочу, чтобы это все время. Это все еще кажется открытой проблемой (по состоянию на январь 2011).

Читайте также: проблемы с jQuery getJSON с использованием локальных файлов в Chrome

по существу, единственный способ справиться с этим-иметь веб-сервер, работающий на localhost, и обслуживать их оттуда.

это небезопасно для браузера, чтобы разрешить ajax-запрос для доступа к любому файлу на вашем компьютере, поэтому большинство браузеров, кажется, рассматривают" файл:// "запросы как не имеющие происхождения для целей"Та Же Политика Происхождения"

запуск веб-сервера может быть таким же тривиальным, как cding в каталог, в котором находятся файлы и работает:

python -m SimpleHTTPServer

вот applescript, который запустит Chrome с включенным параметром --allow-file-access-from-files, для разработчиков OSX / Chrome:

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"    
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

Это решение позволит вам загрузить локальный скрипт с помощью jQuery.getScript(). Это глобальный параметр, но вы также можете установить параметр crossDomain на основе каждого запроса.

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});

как насчет использования javascript FileReader функция для открытия локального файла, т. е.:

<input type="file" name="filename" id="filename">
<script>
$("#filename").change(function (e) {
  if (e.target.files != undefined) {
    var reader = new FileReader();
    reader.onload = function (e) {
        // Get all the contents in the file
        var data = e.target.result; 
        // other stuffss................            
    };
    reader.readAsText(e.target.files.item(0));
  }
});
</script>

Теперь Нажмите Кнопку Choose file кнопка и перейдите к файлу file:///C:/path/to/XSL%20Website/data/home.xml

запустите chrome так, чтобы обойти это ограничение:open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

полученные от комментарий Джоша ли но мне нужно было указать полный путь к Google Chrome, чтобы избежать открытия Google Chrome из моего раздела Windows (в Parallels).

вы можете попробовать положить 'Access-Control-Allow-Origin':'*' на response.writeHead(, {[here]}).

то, как я только что работал над этим, - это вообще не использовать XMLHTTPRequest, а вместо этого включать данные, необходимые в отдельный файл javascript. (В моем случае мне нужен двоичный SQLite blob для использования сhttps://github.com/kripken/sql.js/)

Я создал файл с названием base64_data.js (и используется btoa() чтобы преобразовать данные, которые мне нужны и вставить его в <div> так что я мог бы скопировать его).

var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";

а затем включил данные в html как обычно javascript:

<div id="test"></div>

<script src="base64_data.js"></script>
<script>
    data = atob(base64_data);
    var sqldb = new SQL.Database(data);
    // Database test code from the sql.js project
    var test = sqldb.exec("SELECT * FROM Genre");
    document.getElementById("test").textContent = JSON.stringify(test);
</script>

Я думаю, что было бы тривиально изменить это, чтобы прочитать JSON, может быть, даже XML; я оставлю это как упражнение для читателя ;)