Разрешить Google Chrome использовать XMLHttpRequest для загрузки URL-адреса из локального файла

125

При попытке выполнить HTTP-запрос с использованием XMLHttpRequest из локального файла он в основном терпит неудачу из-за Access-Control-Allow-Originнарушения.

Однако я сам использую локальную веб-страницу, поэтому мне было интересно, есть ли способ заставить Google Chrome разрешать эти запросы, которые поступают из локального файла по URL-адресу в Интернете.

Например, происходит $.get('http://www.google.com/')сбой при выполнении в локальном файле, но я сам написал сценарий для страницы и сам использую его, поэтому было бы чрезвычайно полезно, если бы я мог подавить его и загрузить URL-адрес.

Итак, как я могу разрешить Google Chrome загружать URL-адреса с помощью XMLHttpRequest из локальных файлов?

pimvdb
источник
1
Access-Control-Allow-Origin: nullпо сайту работает. (ofc. not by google.com)
inf3rno
3
@JessamynSmith: порядок ответов меняется, и принятый ответ также может измениться, поэтому лучше указать ссылку на ответ, чем говорить что-то вроде «ответ ниже принятого ответа». Используйте URL-адрес, на который ведет ссылка «Поделиться» в ответе.
Майкл Шепер
2
@MichaelScheper Ваш комментарий несколько неуместен, учитывая, что я вставил действительную команду, которая работала. Однако, если есть смысл включить ссылку, я удалил ее и разместил повторно. В современном Chrome ошибки выглядят так: XMLHttpRequest не может загрузить файл: ///path/to/file/css/base.css. Запросы с перекрестным происхождением поддерживаются только для схем протоколов: http, data, chrome, chrome-extension, https, chrome-extension-resource. Этот ответ stackoverflow.com/a/4819114/1649165 сработал для меня, то есть запустить хром из командной строки: chrome --allow-file-access-from-files
Джессамин Смит
@JessamynSmith: Извините, вы подумали, что мой совет неуместен. Поскольку вы думали, что конкретный ответ актуален, я подумал, что вы можете защитить свой комментарий в будущем. Моя ошибка.
Майкл Шепер

Ответы:

49

запуск Chrome с --disable-web-security

В Windows:

chrome.exe --disable-web-security

На Mac:

open /Applications/Google\ Chrome.app/ --args --disable-web-security

Это позволит выполнять междоменные запросы.
Я не знаю, работает ли это также для локальных файлов, но дайте нам знать!

И обратите внимание, это именно то, что вы ожидаете, отключает веб-безопасность, так что будьте осторожны с этим.

JANDY
источник
Вы также можете использовать Safari на Mac. Он позволяет AJAX обрабатывать локальные файлы по умолчанию, когда запрос выполняется из локального файла. Также, что касается .exe, в Q ничего не сказано о Windows. Пим - разработчик Windows, но все же ничего не сказал о Windows.
1
Да, я использую Windows, извините за это. Сейчас попробую, спасибо. Кстати, я использую Chrome всегда, когда мой компьютер включен, поэтому есть ли способ разрешить междоменный запрос только с локальными файлами или только на определенной вкладке? Потому что таким образом я фактически не могу одновременно безопасно пользоваться Интернетом ...
pimvdb
1
Я только что загрузил последнюю сборку Chromium, чтобы иметь автономную небезопасную версию, работающую для тестирования, и «настоящий» установленный Chrome для безопасного просмотра Интернета. И это работает, спасибо!
pimvdb
@Tom - у вас должна быть возможность сделать это на Mac с Safari без каких-либо изменений настроек, если вы используете протокол «file: ///», а не « localhost »
около Privman
2
Я попробовал его на Safari 10.1, и он дал мне: XMLHttpRequest cannot load file:///<my_local_file>. Cross origin requests are only supported for HTTP.поэтому утверждение о браузере Safari из этой ветки больше не актуально.
Michal Cichon
233

Использование --disable-web-securityпереключателя довольно опасно ! Зачем вообще отключать безопасность, если вы можете просто разрешить XMLHttpRequest доступ к файлам из других файлов с помощью --allow-file-access-from-filesпереключателя?

Перед использованием этих команд обязательно завершите все запущенные экземпляры Chrome.

В Windows:

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

На Mac:

open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files

Обсуждения этой «фичи» Chrome:

Константин Смолянин
источник
5
Можно ли сделать это поведение по умолчанию без необходимости каждый раз открывать терминал / командную строку или настраиваемый ярлык?
Kokodoko
1
@Kokodoko Думаю, нет.
Константин Смолянин
2
@JoshH Я полностью согласен с тем, что гораздо лучше использовать локальный веб-сервер для разработки веб-сайтов, чем обращаться к локальным файлам напрямую через браузер. Однако был задан точный вопрос, и я только что ответил на него.
Константин Смолянин
13
На случай, если кто-то другой собирается попробовать это: этот флаг недоступен / не может быть изменен вchrome://flags
Блейз,
5
@pimvdb Я думаю, вы должны отметить этот ответ как принятый.
chris-l
21

Версия для Mac. Из терминала запустить:

open /Applications/Google\ Chrome.app/ --args --allow-file-access-from-files
горный перевал
источник
Я вижу здесь несколько голосов против. Можете ли вы пояснить, что не так с моим ответом?
Nek
Как объясняют другие ответы, неразумно предлагать отключать всю веб-безопасность, когда есть определенный переключатель, который меняет эту единственную вещь.
curiousdannii
было бы неплохо иметь более постоянное решение. Это предполагает, что пользователь знает заранее, а также требует перезапуска Chrome.
Майкл Данн
3

В Ubuntu:

chromium-browser --disable-web-security

Подробнее / переключатели:

http://peter.sh/experiments/chromium-command-line-switches/

Ссылка из

Таймор Чангайз
источник
Я думаю, что указание файлов будет безопаснее `google-chrome --allow-file-access-from-files ~ / foo`
Мухаммед Мусса
Это немного широко для конкретного случая использования. Но все равно стоит найти решение
Майкл Данн