"Запити перехресного походження підтримуються лише для HTTP." помилка під час завантаження локального файлу


796

Я намагаюся завантажити 3D-модель в Three.js JSONLoader, і ця 3D-модель знаходиться в тому ж каталозі, що і весь веб-сайт.

Я отримую "Cross origin requests are only supported for HTTP."помилку, але не знаю, що її спричиняє, і як її виправити.


23
Ви намагаєтесь це зробити на місцевому рівні?
— WojtekT

10
Вам потрібно скористатися localhost, навіть якщо його локальний файл
— Ніл

22
Але це не перехресний домен!
— corazza

21
Якщо ви користуєтеся Chrome, запуск його з терміналу за допомогою параметра --allow-file-access-from-files може допомогти вам.
— nickiaconis

12
Так, це не дуже крос-домен, коли файл знаходиться в тій самій папці, що і веб-сторінка, тепер це… Я виявив, що якщо ви використовуєте Firefox замість Chrome, проблема відходить.
— Sphinxxx

Відповіді:


790

Мій кришталевий куля говорить про те, що ви завантажуєте модель, використовуючи або, file://або C:/, що залишається вірним повідомленню про помилку, як їх немаєhttp://

Таким чином, ви можете або встановити веб-сервер у свій локальний ПК, або завантажити модель десь в іншому місці, а також використовувати jsonpта змінити URL наhttp://example.com/path/to/model

Походження визначено в RFC-6454 як

   ...they have the same
   scheme, host, and port.  (See Section 4 for full details.)

Тож, хоча ваш файл походить з того самого хоста ( localhost), але поки схема відрізняється ( http/ file), вони розглядаються як різне походження.


7
Так, я намагаюся зробити це за допомогою file://, але не розумію, чому це дозволено. Ну, я встановлюю Lampp, мабуть, ...
— corazza

150
Уявіть, якщо це дозволено, і веб-сторінка, згідно з якою автор сторінки використовує щось на кшталт, load('file://C:/users/user/supersecret.doc')а потім завантажує вміст на свій сервер за допомогою ajax тощо.
— Андреас Вонг,

11
на жаль, політика розробляється для всіх випадків, а не тільки для ваших :(, тож ви повинні з цим
— поводитися

28
На цю тему є сторінка у вікі GitHub: github.com/mrdoob/three.js/wiki/How-to-run-things-locally
— Феліпе Ліма

29
Ви також можете використовувати перемикач --allow-file-access-from-files в хромі. За моя відповідь тут: stackoverflow.com/questions/8449716 / ...
— prauchfuss

609

Щоб бути явним - Так, помилка говорить про те, що ви не можете вказувати свій веб-переглядач безпосередньо file://some/path/some.html

Ось кілька варіантів швидкого відключення локального веб-сервера, щоб ваш браузер міг відображати локальні файли

Пітон 2

Якщо у вас встановлений Python ...

  1. Змініть каталог у папку, де ваш файл some.htmlчи файл (и) існують за допомогою командиcd /path/to/your/folder

  2. Запустіть веб-сервер Python за допомогою команди python -m SimpleHTTPServer

Це запустить веб-сервер для розміщення всього списку каталогів за адресою http://localhost:8000

  1. Ви можете використовувати спеціальний порт, який python -m SimpleHTTPServer 9000дає вам посилання:http://localhost:9000

Цей підхід вбудований у будь-яку установку Python.

Пітон 3

Виконайте ті ж дії, але замість цього скористайтеся наступною командою python3 -m http.server

Node.js

Крім того, якщо ви вимагаєте більш чутливих налаштувань і вже використовуєте nodejs ...

  1. Встановити http-server, ввівшиnpm install -g http-server

  2. Перейдіть у свій робочий каталог, де some.htmlживе ваше життя

  3. Запустіть свій http сервер, видавши http-server -c-1

Це створює http-код Node.js, який подає файли у вашому каталозі як статичні файли, з яких можна отримати http://localhost:8080

Рубін

Якщо улюбленою мовою є Рубі ... Боги Рубін кажуть, що це також працює:

ruby -run -e httpd . -p 8080

PHP

Звичайно, PHP також має своє рішення.

php -S localhost:8000

3
Це врятувало мені тону часу подяки. У моєму програмі установки Python не було модуля SimpleHTTPServer, але інструкції щодо вузла працювали як шарм.
— LukeP

3
У відповідь на коментар LukeP, в python 2.7 команда працює відповідно до інструкцій $ python -m SimpleHTTPServer, яка створює повідомлення: Serving HTTP on 0.0.0.0 port 8000 ...Якщо ви неправильно написали ім'я модуля, наприклад, $ python -m SimpleHttpServerтоді ви отримаєте повідомлення про помилку. No module named SimpleHttpServerВи отримаєте аналогічне повідомлення про помилку, якщо у вас є python3 встановлено (v. python 2.7). Ви можете перевірити свою версію пітона з допомогою команди: $ python --version. Ви також можете вказати порт для прослуховування так:$ python -m SimpleHTTPServer 3333
— 7

1
Сервер python обслуговує файли з каталогу, де ви запускаєте сервер. Отже, якщо файли, які ви хочете обслуговувати, знаходяться в / Users / 7stud / angular_projects / 1app, тоді запустіть сервер у цьому каталозі, наприклад $ cd ~/angular_projects/1app, тоді $ python -m SimpleHTTPServer. У своєму браузері введіть URL-адресу http://localhost:8000/index.html. Ви також можете запитувати файли в підкаталогах каталогу, де ви запустили сервер, наприкладhttp://localhost:8000/subdir/hello.html
— 7

2
Я чув, що Python простий і потужний, як і мова "X", але це смішно! Не потрібно встановлювати XAMPP або встановлювати простий http-сервер js з вузлом для обслуговування статичних файлів - Одна команда і бум! Дякую велике, економить багато часу та клопоту.
— РД

2
ДУЖЕ! - для використання Python в Windows: python -m http.server 8080 ... або будь-який порт, який ви хочете, і коли ви хочете залишити його просто ctrl-c.
— Крістофер

161

У Chrome ви можете використовувати цей прапор:

--allow-file-access-from-files

Детальніше читайте тут.


11
@ Blairg23, майте на увазі, що для цього рішення потрібно перезапустити всі екземпляри Chrome.exe, щоб він працював
— Алекс Клаус

3
Поясніть, будь ласка, як це використовувати в хромі.
— Рішабх Аграхарі

@Priya Не повинен цього робити
— Suraj Jain

Я б запропонував використовувати Chromium лише для локальної налагодження (починаючи з прапора --allow-file-access-from-files). Це означає використовувати Chrome для загального веб-перегляду та використовувати Chromium як додаток за замовчуванням для файлу HTML.
— Алан Чжілянг Фен

Зауважте, що fetch()все одно це все одно заперечує. Ви повинні XMLHttpRequestякось використовувати
— Hashbrown

63

Зустрілися до цього сьогодні.

Я написав код, який виглядав приблизно так:

app.controller('ctrlr', function($scope, $http){
    $http.get('localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

... але це мало виглядати так:

app.controller('ctrlr', function($scope, $http){
    $http.get('http://localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

Єдиною відмінністю була відсутність http://у другому фрагменті коду.

Просто хотів це викласти на випадок, якщо є інші, які мають подібну проблему.


40

Просто змініть URL на, http://localhostа не на localhost. Якщо ви відкриєте файл html з локального, вам слід створити локальний сервер для обслуговування цього html-файлу, використовуючи найпростіший спосіб Web Server for Chrome. Це вирішить проблему.


5
+1 для Web Server for Chromeпосилання на додаток - це на сьогоднішній день найпростіше і найчистіше рішення для тимчасової настройки httpd для Chrome IMO

Це врятувало мене. Точне рішення
— Сурія

18

Наприклад, у додатку для Android, щоб дозволити JavaScript мати доступ до активів через file:///android_asset/- використовуйте setAllowFileAccessFromFileURLs(true)те, WebSettingsщо ви отримуєте від дзвінкаgetSettings() на WebView.


Блискуче! Ми збиралися переписати методи введення JSON в змінні .. але це працює! webView.getSettings (). setAllowFileAccessFromFileURLs (true);
— WallyHale

15

Використовуйте http://або https://для створення URL-адреси

помилка :localhost:8080

рішення :http://localhost:8080


14

найшвидший спосіб для мене був: для користувачів Windows запустіть ваш файл на вирішеній проблемі Firefox, або якщо ви хочете використовувати chrome, найпростішим способом для мене було встановити Python 3, то з командної строки запустіть команду, python -m http.server потім перейдіть на http: // localhost: 8000 / потім перейдіть до своїх файлів

python -m http.server

13

Я перерахую 3 різні підходи до вирішення цього питання:

  1. Використання дуже легкого npmпакету : Встановіть живий сервер за допомогою npm install -g live-server. Потім перейдіть до цієї директорії, відкрийте термінал і введіть live-serverта натисніть клавішу Enter, на якій буде розміщена сторінкаlocalhost:8080 . БОНУС: Він також підтримує гаряче перезавантаження за замовчуванням.
  2. Використовуючи легкий додаток Google Chrome , розроблений Google : Установіть програму, перейдіть на вкладку додатків у Chrome і відкрийте додаток. У додатку наведіть його на праву папку. Ваша сторінка буде розміщена!
  3. Змінення ярлика Chrome у вікнах : Створіть ярлик браузера Chrome. Клацніть правою кнопкою миші на значку та відкрийте властивості. У властивостях, редагувати targetдо "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession"і зберегти. Потім за допомогою Chrome відкрийте сторінку за допомогою ctrl+o. ПРИМІТКА: НЕ використовуйте цю ярлику для регулярного перегляду.

12

Для тих, хто має Windows без Python або Node.js, є ще легке рішення: Mongoose .

Все, що вам потрібно зробити - це перетягнути виконуваний файл туди, де має бути корінь сервера, та запустіть його. На панелі завдань з’явиться значок, який перейде на сервер у браузері за замовчуванням.

Також Z-WAMP - це 100% портативний WAMP, який працює в одній папці, це приголомшливо. Це варіант, якщо вам потрібен швидкий сервер PHP та MySQL.


Якщо ви встановили php або встановили, можете запустити сервер у своїй папці: php.net/manual/es/features.commandline.webserver.php
— jechaviz

12

Якщо ви використовуєте Mozilla Firefox, він буде працювати, як очікувалося, без проблем;

PS Дивно, але IntenetExplorer_Edge працює прекрасно !!!


1
більше не. firefox і т. п. блокують запит на мене.
— Baahubali

також не подобається добре отримувати доступ до незахищених сторінок: D
— csomakk

6

Просте рішення для кого з використанням VS Code

Я певний час отримував цю помилку. Більшість відповідей працює. Але я знайшов інше рішення. Якщо ви не хочете мати справу з node.jsбудь-яким іншим рішенням тут, і ви працюєте з HTML-файлом (викликом функцій з іншого js-файлу чи отримання файлу json api), спробуйте використовувати Live Server розширенням .

Це дозволяє легко відкрити живий сервер. І через це створює localhostсервер, проблема вирішується. Ви можете просто запустити localhostфайл, відкривши файл HTML і клацніть правою кнопкою миші на редакторі та натисніть на Open with Live Server.

Це в основному завантаження файлів, http://localhost/index.htmlа не використання file://....

EDIT

.htmlФайл не обов’язково мати . Можна запустити Live Server за допомогою ярликів.

Натисніть, (alt+L, alt+O)щоб відкрити сервер і (alt+L, alt+C)зупинити сервер. [Про MAC cmd+L, cmd+Oта cmd+L, cmd+C]

Сподіваюся, це комусь допоможе :)


4

Я отримував цю точну помилку під час завантаження HTML-файлу у браузер, який використовував файл json з локального каталогу. У моєму випадку мені вдалося вирішити це, створивши простий сервер вузлів, який дозволяв сервер статичного вмісту. Я залишив код для цього в іншій відповіді .


4

Я пропоную вам використовувати міні-сервер для запуску таких програм у localhost (якщо ви не використовуєте якийсь вбудований сервер).

Ось такий, який дуже просто встановити та запустити:

https://www.npmjs.com/package/tiny-server

4

Я підозрюю, що це вже згадувалося в деяких відповідях, але я трохи модифікую це, щоб мати повну робочу відповідь (простіше знайти та використовувати).

  1. Перейдіть за посиланням: https://nodejs.org/en/download/ . Встановити nodejs.

  2. Встановіть http-сервер, запустивши команду з командного рядка npm install -g http-server.

  3. Перейдіть у свій робочий каталог, де index.html/ yoursome.htmlпроживає.

  4. Запустіть свій http сервер, запустивши команду http-server -c-1

Відкрийте веб-браузер до http://localhost:8080 або http://localhost:8080/yoursome.html - залежно від назви файлу html.


3

Це просто говорить про те, що додаток слід запускати на веб-сервері. У мене була така ж проблема з хромом, я запустив tomcat і переніс свою заявку туди, і вона спрацювала.


1

е. Щойно я знайшов офіційні слова "Спроба завантажити невбудовані віддалені модулі AMD, які використовують плагін dojo / text, не вдасться через обмеження безпеки поперечного походження. (Вбудовані версії модулів AMD не впливають, оскільки виклики доджо / тексту усуваються система побудови.) " https://dojotoolkit.org/documentation/tutorials/1.10/cdn/


1

Один із способів завантаження локальних файлів - це використання їх у папці проекту замість папки проекту. Створіть одну папку під файлами прикладу проекту, подібним до того, як ми створюємо для зображень, і замініть розділ, де використовується повний локальний шлях, відмінний від шляху проекту, та використовуйте відносну URL-адресу файлу в папці проекту. Це працювало для мене


1

Для всіх ви MacOS... налаштуйте простий LaunchAgent, щоб увімкнути ці гламурні можливості у власній копії Chrome ...

Збережіть plist, назване ім’ям будь-якого ( launch.chrome.dev.mode.plistнаприклад,) ~/Library/LaunchAgentsіз подібним вмістом до ...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>launch.chrome.dev.mode</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/Google Chrome.app/Contents/MacOS/Google Chrome</string>
        <string>-allow-file-access-from-files</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Він повинен запускатися при запуску .. але ви можете змусити це робити в будь-який час за допомогою термінальної команди

launchctl load -w ~/Library/LaunchAgents/launch.chrome.dev.mode.plist

ТАДА! 😎 💁🏻 🙊 🙏🏾


1
  • Встановіть локальний веб-сервер для Java, наприклад, Tomcat, для php можна використовувати лампу тощо
  • Видаліть файл json у каталог загальнодоступних серверів додатків
  • Елемент списку

  • Запустіть сервер додатків, і ви зможете отримати доступ до файлу з localhost


1

Неможливо завантажити статичні локальні файли (наприклад: svg) без сервера. Якщо на вашому пристрої встановлено NPM / YARN, ви можете налаштувати простий http-сервер за допомогою " http-сервера "

npm install http-server -g
http-server [path] [options]

Або відкрийте термінал у папці проекту та введіть "hs". Він автоматично запустить живий сервер HTTP.


дубльована відповідь
— Скотт Стенсленд


0

Я також зміг відтворити це повідомлення про помилку під час використання тега прив’язки із наступним href:

<a href="javascript:">Example a tag</a>

У моєму випадку для отримання "курсору вказівника" використовувався тег, і подія насправді контролювалася деякою подією jQuery при натисканні. Я видалив href і додав клас, який застосовується:

cursor:pointer;


0

Для користувачів Linux Python:

import webbrowser
browser = webbrowser.get('google-chrome --allow-file-access-from-files %s')
browser.open(url)

Чи немає причини, чому google-chrome --allow-file-access-from-files <url>б не працювати і бути більш лаконічним?
— agupta231

@ agupta231 Модуль веб-браузера має аргументи, які дозволяють вам відкривати різні види, наприклад. відкрити в поточній вкладці, новій вкладці, новому вікні тощо
— Daniel Braun

0

Якщо ви наполягаєте на запуску .htmlфайла локально і не обслуговуєте його за допомогою веб-сервера, ви можете попередити, щоб ці запити перехресного походження не відбувалися в першу чергу, зробивши проблемні ресурси доступними в рядку.

У мене виникла ця проблема, коли я намагався обслуговувати .jsфайли file://. Моє рішення полягало в тому, щоб оновити сценарій збірки, щоб замінити <script src="...">теги <script>...</script>. Осьgulp підхід для цього:

1. запустити npm install --save-devв пакети gulp, gulp-inlineіdel .

2. Після створення gulpfile.jsкореневого каталогу додати наступний код (просто змінити шляхи до файлів на те, що підходить тобі):

let gulp = require('gulp');
let inline = require('gulp-inline');
let del = require('del');

gulp.task('inline', function (done) {
    gulp.src('dist/index.html')
    .pipe(inline({
        base: 'dist/',
        disabledTypes: 'css, svg, img'
    }))
    .pipe(gulp.dest('dist/').on('finish', function(){
        done()
    }));
});

gulp.task('clean', function (done) {
    del(['dist/*.js'])
    done()
});

gulp.task('bundle-for-local', gulp.series('inline', 'clean'))
  1. Або запустіть gulp bundle-for-localабо оновіть свій сценарій збірки, щоб запустити його автоматично.

Ви можете ознайомитись з детальною проблемою та рішенням моєї справи тут .


-1

кордова досягти цього. Я досі не можу зрозуміти, як зробила кордова. Він навіть не проходить черезInInceptRequest.

Пізніше я з’ясував, що ключем для завантаження будь-якого файлу з локального є: myWebView.getSettings (). SetAllowUniversalAccessFromFileURLs (true);

І коли ви хочете отримати доступ до будь-якого ресурсу http, веб-перегляд здійснить перевірку методом OPTIONS, який ви можете надати доступ через WebViewClient.shouldInterceptRequest шляхом повернення відповіді, а для наступного методу GET / POST ви можете просто повернути нуль.



-1

Переживав це, коли я завантажував сторінку для перегляду в режимі офлайн.

Я просто повинен був видалити integrity="*****"і crossorigin="anonymous"атрибути з усіх <link>і <script>тегів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.