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


209

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

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

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

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

Ответы:


177

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

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

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

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


1
@Rich, рад, что это помогло! Интересно, будет ли повышенный спрос на это с толчком Google к браузерным приложениям. Я думаю, что спрос будет только расти.
Кортни Кристенсен

4
это было полезно для Маков OS X cweagans.net/blog/2011/1/24/...
Kinet

1
Спасибо, мне было интересно, где я неправильно кодировал, кажется, проблема в браузере.
Арда

4
Есть ли какая-либо причина --allow-file-access-from-files не решит проблему. Я просто пытаюсь загрузить файл сценария, например, $ .getScript ("application.js"); и получите ошибку, описанную в вопросе.
Дензо

1
Это работает, однако: «Перед выполнением команды убедитесь, что все окна Chrome закрыты и не запускаются иначе. Или параметр командной строки не будет работать». Chrome.exe --allow-file-access-from- файлы "" ( stackoverflow.com/a/4208455/1272428 )
rluks

87

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

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

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

python -m SimpleHTTPServer

1
Я надеюсь разработать решение, которое не требует от пользователя использования чего-либо большего, чем его веб-браузер. Использование Python, любого интерпретатора или любого несистемного программного обеспечения нежизнеспособно.
Кевин Эррера

5
Ну, единственное другое решение, которое я могу придумать, - это загрузить все это на одной странице, чтобы вам не нужно было делать какие-либо запросы ajax в файловую систему.
Singletoned

2
Спасибо @Singletoned! Я использую ваше решение, и это очень удобно!
Хенди Ираван

4
И если вы используете Python 3, команда будет python -m http.server.
alextercete

4

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

14
Вы можете просто использовать открытые (1) , чтобы добавить флаги: open -a 'Google Chrome' --args --allow-file-access-from-files.
Джош Ли

4

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

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

работал как шарм для загрузки локального файла JS из локального файла HTML! спасибо, именно то, что мне было нужно.
user1577390

4

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


3

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

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


2

Способ, который я только что обошел, заключается в том, чтобы вообще не использовать XMLHTTPRequest, а вместо этого включить необходимые данные в отдельный файл javascript. (В моем случае мне понадобился двоичный двоичный объект SQLite для использования с 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; Я оставлю это как упражнение для читателя;)


1

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


6
откуда берется response.writeHead, как его назвать и где? Можете ли вы привести больше примеров? Имейте в виду, что это локальная файловая система, а не сервер. Насколько я понимаю, это значение может быть установлено только с сервера?
Джозеф Астрахань

0

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

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

   https://127.0.0.1:8887/fileName.txt

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.