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

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

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

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

174 голосов
/ 20 января 2011

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

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

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

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

86 голосов
/ 25 ноября 2010

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

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

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

python -m SimpleHTTPServer
4 голосов
/ 31 мая 2014

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

4 голосов
/ 22 августа 2013

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

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});
4 голосов
/ 09 августа 2011

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

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

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

1 голос
/ 29 октября 2015

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

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

1 голос
/ 25 июля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...