XMLHttpRequest Origin null не разрешен Access-Control-Allow-Origin для файла:///для файла:///(без сервера)

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

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

Когда я пытаюсь использовать плагин 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/.

Как я могу это исправить?

Ответ 1

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

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

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

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

Ответ 2

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

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

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

python -m SimpleHTTPServer

Ответ 3

Вот яблоко, которое запустит 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 &"

Ответ 4

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

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

Ответ 5

Как насчет использования 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

Ответ 6

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

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

Ответ 7

Способ, которым я только что работал, заключается не в том, чтобы использовать 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; Я оставлю это как упражнение для читателя;)

Ответ 8

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

Ответ 9

используйте "веб-сервер для приложения Chrome". (На самом деле он у вас есть на компьютере, знаете ли вы или нет. Просто найдите его в Кортане!). откройте его и нажмите "выбрать файл", выберите папку с вашим файлом в нем. на самом деле не выбирайте свой файл. выберите папку с файлами, затем нажмите на ссылку (и) под кнопкой "Выбрать папку".

если это не приведет вас к файлу, добавьте имя файла в urs. как это:

   https://127.0.0.1:8887/fileName.txt

ссылка на веб-сервер для Chrome: нажмите меня