У меня есть приложение AngularJS/Cordova, которое проверяет службу JSON на удаленном сервере:
$http({method: 'GET', url: 'http://example.com/index.php'})
Разработка в браузере и запуск моего сервера apache-сервера (http://dev
). Я получаю заголовок "Нет" Access-Control-Allow-Origin ", поэтому я исправляю это, добавляя:
Header set Access-Control-Allow-Origin "http://dev"
Все работает отлично, и я вижу Origin:http://dev
в моих инструментах Chrome dev.
Итак, чтобы подумать об этом в первый раз, мне интересно, что будет происходить, когда приложение работает в веб-обозревателе Android/iOS. Я решил сделать сборку и развертывание на своих устройствах и ожидать увидеть ту же ошибку в удаленной отладке (Safari для iOS и Weinre для Android), но, к моему удивлению, она работает (без отправки заголовков CORS)! Я также обнаружил, что в обоих устройствах приложение работает в веб-просмотре по схеме file://, а не (как я предполагал) HTTP-серверу, который был предоставлен операционной системой телефона.
Итак, исследование, похоже, предполагает, что CORS не требуется для файла://- такой "сайт" может получить доступ к любому ресурсу XHR в любом домене. Но, когда я тестирую это на настольных браузерах, я обнаружил, что, хотя Safari не нужен CORS для файла://но Chrome делает, и FireFox работает в любом случае без CORS
Итак, мои вопросы:
1) Почему мое приложение работает без CORS в Android/iOS - это потому, что CORS не применяется к файлу://, или, что Кордова делает что-то, чтобы заставить его работать на устройстве?
У меня <access origin="*"/>
в моей конфигурации
2), если в ожидании ответов на Q1 я должен быть на безопасном сайте и явно разрешать запросы из приложений, какое значение вы даете Access-Control-Allow-Origin для файла:// "hosts"? в моей отладке в запросах из файла нет заголовка Origin://
3) в дополнение к блокировке запроса XHR на удаленный сервер, Chrome также блокирует мои шаблоны приложений (я использую отдельные файлы), см. ниже. Это потенциальная проблема с моим приложением или просто проблема Chrome, о которой мне не нужно беспокоиться?
XMLHttpRequest cannot load file:///Volumes/projects/phonegap/www/templates/tabs.html. Cross origin requests are only supported for HTTP.