AngularJS 오류 : 교차 출처 요청은 프로토콜 체계 (http, data, chrome-extension, https)에서만 지원됩니다.


130

매우 간단한 각도 js 응용 프로그램의 세 파일이 있습니다.

index.html

<!DOCTYPE html>
<html ng-app="gemStore">
  <head>
    <script src='https://ajax.googleapis.com/ajax/libs/angularjs/1.3.8/angular.min.js'></script>
    <script type="text/javascript" src="app.js"></script>
  </head>

  <body ng-controller="StoreController as store">
      <div class="list-group-item" ng-repeat="product in store.products">
        <h3>{{product.name}} <em class="pull-right">{{product.price | currency}}</em></h3>
      </div>

  <product-color></product-color>
  </body>
</html>

product-color.html

<div class="list-group-item">
    <h3>Hello <em class="pull-right">Brother</em></h3>
</div>

app.js

(function() {
  var app = angular.module('gemStore', []);

  app.controller('StoreController', function($http){
              this.products = gem;
          }
  );

  app.directive('productColor', function() {
      return {
          restrict: 'E', //Element Directive
          templateUrl: 'product-color.html'
      };
   }
  );

  var gem = [
              {
                  name: "Shirt",
                  price: 23.11,
                  color: "Blue"
              },
              {
                  name: "Jeans",
                  price: 5.09,
                  color: "Red"
              }
  ];

})();

productColor라는 사용자 지정 지시문을 사용하여 product-color.html의 포함을 입력하자마자이 오류가 발생하기 시작했습니다.

XMLHttpRequest cannot load file:///C:/product-color.html. Cross origin requests are only supported for protocol schemes: http, data, chrome-extension, https, chrome-extension-resource.
angular.js:11594 Error: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'file:///C:/product-color.html'.

무엇이 잘못 될 수 있습니까? product-color.html에 대한 경로 문제입니까?

내 세 파일은 모두 같은 루트 폴더에 있습니다 C:/user/project/


1
내 경우처럼 바보 같은 일을하면 실수로 TLD를 포트에 추가했습니다 : " localhost : 8070.com "같은 오류가 발생합니다. 해결하려는 URL을 확인하십시오!
Wildhoney


답변:


306

이 오류는 브라우저에서 직접 html 문서를 열기 때문에 발생합니다. 이 문제를 해결하려면 웹 서버에서 코드를 제공하고 localhost에서 액세스해야합니다. Apache 설정이있는 경우이를 사용하여 파일을 제공하십시오. JetBrains IDE, Eclipse 등과 같은 일부 IDE는 웹 서버에 내장되어 있습니다.

Node.Js 설정이 있으면 http-server를 사용할 수 있습니다 . 그냥 실행 npm install http-server -g하면와 같은 터미널에서 사용할 수 있습니다 http-server C:\location\to\app.


6
훌륭한 솔루션!
Jorge Jorge

3
http-server는 로컬에서 호스팅하는 가장 간단한 방법입니다. 참고 : Windows에 npm이 없으면 node.js를 설치하면 cmd에서 사용할 수 있습니다.
Octane

3
그리고 안드로이드의 webview에서 일어난다면 어떻게해야합니까!?
Dr.jacky

2
호기심 때문에 왜 웹 브라우저에서 파일을 열 수 없습니까?
tobiak777

3
@reddy 평범하고 단순함 : 브라우저가 컴퓨터에서 직접 파일 시스템에 액세스하는 것은 보안 문제입니다.
Alex J

49

매우 간단한 수정

  1. 앱 디렉토리로 이동
  2. SimpleHTTPServer 시작


터미널에서

$ cd yourAngularApp
~/yourAngularApp $ python -m SimpleHTTPServer

이제 브라우저에서 localhost : 8000으로 이동하면 페이지가 표시됩니다


8
파이썬 3에서는이어야합니다 python -m http.server.
Luan Nico

1
이것은 많은 도움이되었습니다! 훌륭한 솔루션.
mirta

42

크롬에서는 작업이 허용되지 않습니다. HTTP 서버 (Tomcat)를 사용하거나 Firefox를 대신 사용할 수 있습니다.


4
내 상황에서 대신 파이어 폭스를 사용했으며 작동합니다. 크롬은 Firefox보다 더 많은 보안 기능을 가지고 있습니까? 내가 왜 이렇게 할 수
있습니까

그게 가장 좋은 대답입니다.
Thomas

1
짧고 간단합니다.
viks

정말 나에게 도움이되었습니다.
Ram Dutt Shukla 8:24에

1
이봐 .. 정말 감사합니다. 당신의 대답은 정말 큰 도움이되었습니다 ... 내 시간을 너무 많이 절약
Megha

31

http://URL 주소 에 추가하면 문제가 해결되었습니다 . 예를 들어 http://localhost:3000/movies대신을 사용 했습니다 localhost:3000/movies.


13

크롬 / 크롬 브라우저 (예 : 우분투 14.04)에서 이것을 사용하는 경우 아래 명령 중 하나를 사용 하여이 문제를 해결할 수 있습니다.

ThinkPad-T430:~$ google-chrome --allow-file-access-from-files
ThinkPad-T430:~$ google-chrome --allow-file-access-from-files fileName.html

ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files
ThinkPad-T430:~$ chromium-browser --allow-file-access-from-files fileName.html

이를 통해 파일을 크롬 또는 크롬으로로드 할 수 있습니다. 윈도우에서 동일한 작업을 수행 해야하는 경우 크롬 바로 가기 속성 에이 스위치를 추가하거나 cmd플래그 를 사용하여 실행할 수 있습니다 . Chrome, Opera, Internet Explorer에서는 기본적으로이 작업이 허용되지 않습니다. 기본적으로 Firefox 및 Safari에서만 작동합니다. 따라서이 명령을 사용하면 도움이됩니다.

또는 원하는 언어에 따라 웹 서버 (예 : Tomcat-java, NodeJS-JS, Tornado-Python 등)에서 호스팅 할 수도 있습니다. 이것은 모든 브라우저에서 작동합니다.


12

어떤 이유로 든 웹 서버에서 파일을 호스팅 할 수없고 부분로드 방법이 여전히 필요한 경우 ngTemplate지시문 을 사용할 수 있습니다 .

이런 식으로 index.html 파일의 스크립트 태그 안에 마크 업을 포함시킬 수 있으며 실제 지시문의 일부로 마크 업을 포함하지 않아도됩니다.

이것을 index.html에 추가하십시오

<script type='text/ng-template' id='tpl-productColour'>
 <div class="list-group-item">
    <h3>Hello <em class="pull-right">Brother</em></h3>
</div>
</script>

그런 다음 지시에 따라

app.directive('productColor', function() {
      return {
          restrict: 'E', //Element Directive
          //template: 'tpl-productColour'
          templateUrl: 'tpl-productColour'
      };
   }
  );

'TPL-productColor': 이미이 게시물에 사용 templateUrl 편집 한 것처럼
HANU

5

근본 원인 :

파일 프로토콜이 Chrome에 대한 교차 출처 요청을 지원하지 않습니다

해결책 1 :

파일 대신 http 프로토콜을 사용하십시오. 즉, 아파치 또는 nodejs + http-server와 같은 http 서버 설정

Sotution 2 :

추가 --allow-파일 액세스 -에서 - 파일 이 바로 가기를 사용 Chrome`s 바로 가기 대상 후, 열린 새 찾아보기 인스턴스를

여기에 이미지 설명을 입력하십시오

해결책 3 :

대신 Firefox를 사용하십시오


사용 파이어 폭스는 나에게 도움이
바이 니스 Subbaraya을

5
  1. http-server를 설치하고 명령을 실행하십시오. npm install http-server -g
  2. index.html이있는 경로에서 터미널을 엽니 다.
  3. 명령을 실행 http-server . -o
  4. 즐기세요!

4

xampp, mamp 유형의 항목을 사용하고 htdocs 폴더에 프로젝트를 넣을 수 있으므로 localhost에서 액세스 할 수 있다고 덧붙입니다.


2

서버를 이미 실행중인 경우 API 호출에서 http : // 를 사용하는 것을 잊지 마십시오 . 심각한 문제가 발생할 수 있습니다.


고마워, 같은 문제에 대한 해결책을 찾고 두 시간이 ...
산티 누네즈

환영합니다 Happy Coding :)
Edison D' souza 님이

1

이유

Apache와 같은 서버를 통해 페이지를 열지 않으므로 브라우저가 리소스를 얻으려고 할 때 별도의 도메인에서 온 것으로 간주되어 허용되지 않습니다. 일부 브라우저는 허용하지만

해결책

inetmgr을 실행하고 페이지를 로컬에서 호스팅하고 http : // localhost : portnumber / PageName.html 또는 Apache, nginx, 노드 등과 같은 웹 서버를 탐색하십시오.

다른 브라우저를 사용하십시오. Firefox 및 Safari를 사용하여 페이지를 직접 열 때 오류가 표시되지 않았습니다. Chrome 및 IE (xx)에만 제공됩니다.

Brackets, Sublime 또는 Notepad ++와 같은 코드 편집기를 사용하는 경우 해당 앱은이 오류를 자동으로 처리합니다.


1

Firefox와 Safari에서는이 문제가 발생하지 않습니다. 최신 버전의 xml2json.js를 사용하고 있는지 확인하십시오. IE에서 XML 파서 오류가 발생했기 때문입니다. Chrome에서 가장 좋은 방법은 Apache 또는 XAMPP와 같은 서버에서 여는 것입니다.



0

다음 플래그를 사용하여 크롬을 열어야합니다. 실행 메뉴로 이동하여 "chrome --disable-web-security --user-data-dir"을 입력하십시오.

플래그를 사용하여 크롬을 열기 전에 크롬의 모든 인스턴스가 닫혀 있는지 확인하십시오. CORS가 활성화되었음을 나타내는 보안 경고가 나타납니다.


0

@Kirill Fuchs에 탁월한 솔루션을 추가하고 @StackUser의 의심에 답하십시오-http-server를 시작하는 동안 html 페이지가 아닌 앱 폴더까지 경로를 설정하십시오! 폴더 아래에 http-server C:\location\to\app액세스index.htmlapp


0

C : /user/project/index.html로 이동하여 Visual Studio 2017, 파일> 브라우저에서보기로 열거 나 Ctrl + Shift + W를 누르십시오.


-1

나는 같은 문제가 있었다. 내 app.js 파일에 아래 코드를 추가 한 후 수정되었습니다.

var cors = require('cors')
app.use(cors());
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.