http : // localhost가 원점 일 때 치명적인 CORS


186

적절한 헤더로 서버 (nginx / node.js)를 설정했지만이 CORS 문제가 발생합니다.

Chrome 네트워크 창-> 응답 헤더에서 볼 수 있습니다.

Access-Control-Allow-Origin:http://localhost

트릭을 수행해야합니다.

테스트에 사용하는 코드는 다음과 같습니다.

var xhr = new XMLHttpRequest();
xhr.onload = function() {
   console.log('xhr loaded');
};
xhr.open('GET', 'http://stackoverflow.com/');
xhr.send();

나는 얻다

XMLHttpRequest가 http://stackoverflow.com/을 로드 할 수 없습니다 . Origin http : // localhost 는 Access-Control-Allow-Origin에서 허용되지 않습니다.

서버 구성이 아닌 클라이언트 스크립트에 문제가 있다고 생각합니다 ...


44
아니요, stackoverflow.com은이 헤더를 설정해야합니다. :엑스. 그렇지 않으면 동일한 원산지 정책의 요점은 무엇입니까?
Esailija

3
스택 오버플로가 아닌 설정 한 서버에 액세스하십시오. ;)
Nek

도! 내 출처가 localhost 일 때 헤더가 누락 된 경우에도 리소스를 가져 오기 위해 크롬 (또는 다른 브라우저)에 알리는 방법이 있습니까?
whadar

Chrome (20.0.1132.57, Windows 7)에서 코드를 실행하면 정상적으로 작동합니다.
imwilsonxu

1
포트와 함께 localhost를 사용하는 경우이 답변은 serverfault.com/a/673551/238261에 효과적 이었습니다.
Nelu

답변:


230

Chrome 은 CORS 요청에 대한 로컬 호스트를 지원하지 않습니다 (2010 년에 버그가 발생하여 2014 년에 WontFix로 표시됨).

이 문제를 해결하려면 lvh.me(localhost와 마찬가지로 127.0.0.1을 가리키는) 같은 도메인을 사용 하거나 --disable-web-security플래그로 크롬을 시작하십시오 (테스트 중이라고 가정).


24
@greensuisse-localhost에 게시하지 않습니다. 로컬 호스트에서 문제가되는 게시물 입니다 .
Cheeso

9
해당 버그는 유효하지 않으며 crbug.com/67743#c17 로 표시되었습니다 . Esailija의 의견 은 정확합니다.이 헤더를 localhost에 추가해도 마술로 다른 모든 사이트에 액세스 할 수는 없습니다. 이 헤더와 함께 제공되어야하는 원격 사이트입니다.
Rob W

22
Firefox에서 2 시간 동안 Firefox에서 완벽하게 작동하는지 확인하기 위해 테스트했습니다.Grrrr...
FloatingRock

11
. 기타 옵션 : 당신의 호스트가 127.0.0.1 로컬 [내 사이트] .COM 점, 다음 CORS 파일을 너무 파일을 편집 * 허용 [내 사이트] .COM.

6
FireFox와 같은 문제에 직면했습니다. Edge에서만 만들 수있었습니다! 멋진 게시물이지만 환상적입니다! :)
Luis Gouveia

54

@Beau의 답변에 따라 Chrome은 localhost CORS 요청을 지원하지 않으므로이 방향으로 변경 될 가능성이 없습니다.

내가 사용 허용 - 제어 - - 원산지 허용 : * 크롬 확장 이 문제를 주변에 이동합니다. 확장은 CORS에 필요한 HTTP 헤더를 추가합니다.

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS"
Access-Control-Expose-Headers: <you can add values here>

소스 코드는 Github에서에 게시됩니다 .

확장 프로그램은 기본적으로 모든 URL을 필터링합니다. Dropbox와 같은 일부 웹 사이트가 손상 될 수 있습니다. 다음 URL 필터로 로컬 호스트 URL 만 필터링하도록 변경했습니다.

*://localhost:*/*

14
@beau 링크를 읽으면 Chrome 100 %가 localhost와의 출처 간 요청을 지원한다는 것을 알 수 있습니다. 이 문제는 재현 할 수 없어 2014 년에 종료되었습니다. 해당 스레드의 나머지 노이즈는 원래의 비질의 서버가 잘못 구성된 사람들입니다 (원래 질문과 동일).
Molomby

1
크롬에서 나를 위해 매력처럼 일했습니다
Aakash Sahai


3
이 확장 기능은 작동하지 않습니다 Access-Control-Allow-Credentials: true그것을 설정하기 때문에 Access-Control-Allow-Origin*모두를 가진 true*브라우저에 의해 차단됩니다. 신임 정보를 true로 사용하는 경우 와일드 카드가 아닌 원본을 사용해야합니다. Moesif Origins와 CORS Changer Extension을 사용하면 원하는 헤더를 변경할 수 있습니다.
사무엘

어쩌면 내가 잘못하고 있지만 확장이 더 이상 작동하지 않는 것 같습니다.
James Parker

19

실제 문제는 -Allow-모든 요청 ( OPTIONS& POST)에 대해 설정하면 Chrome에서 취소한다는 것입니다. 다음 코드는 POSTChrome을 사용 하여 LocalHost와 함께 작동합니다.

<?php
if (isset($_SERVER['HTTP_ORIGIN'])) {
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header("Access-Control-Allow-Origin: *");
    header('Access-Control-Allow-Credentials: true');    
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
}   
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS");         
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    exit(0);
} 
?>

15
OP는 nginx / node.js를 사용하고 있습니다. PHP 아님
code_monk

4

Chrome은 CORS를 localhost원점 에서 요청 합니다. Chrome에서는 문제가되지 않습니다.

로드 할 수없는 이유 http://stackoverflow.comAccess-Control-Allow-Origin헤더가 localhost오리진을 허용하지 않았기 때문 입니다.


2

빠르고 더러운 Chrome 확장 프로그램 수정 :

Moesif Orign & CORS 체인저

그러나 Chrome은 localhost의 교차 출처 요청을 지원합니다. 대한 헤더를 추가해야합니다 Access-Control-Allow-Origin위해 localhost.


이 확장 기능을 Opera에 추가하고 이제는 확장했습니다. 나는 언제 켜고 끌 수 없으므로 파이어 폭스를 사용합니다. 그리고 개발을위한 오페라. 구글 슈트는 그것을 좋아하지 않으며, 다른 것들도 좋아하지 않습니다.
Maddocks

1

어떤 확장도 나를 위해 작동하지 않았으므로 간단한 로컬 프록시를 설치했습니다. 제 경우에는 https://www.npmjs.com/package/local-cors-proxy 2 분 설정입니다.

(사이트에서)

npm install -g local-cors-proxy

CORS 문제가있는 API 엔드 포인트 : https://www.yourdomain.ie/movies/list

프록시 시작 : lcp --proxyUrl https://www.yourdomain.ie

그런 다음 클라이언트 코드에서 새로운 API 엔드 포인트 : http://localhost:8010/proxy/movies/list

나를 위해 매력처럼 일했습니다 : 앱이 프록시를 호출하고 누가 서버를 호출하는지. 제로 CORS 문제.


0

헤더를 만지지 않고 서버 측에서 리디렉션을 결정하고 매력처럼 깨달았습니다.

아래 예제는 현재 버전의 Angular (현재 9) 및 웹팩 DevServer를 사용하는 다른 프레임 워크에 대한 것입니다. 그러나 다른 백엔드에서도 동일한 원칙이 작동한다고 생각합니다.

따라서 proxy.conf.json 파일에서 다음 구성을 사용합니다 .

{
  "/api": {
    "target": "http://localhost:3000",
    "pathRewrite": {"^/api" : ""},
   "secure": false
 }
}

Angular의 경우 해당 구성을 제공합니다.

$ ng serve -o --proxy-config=proxy.conf.json

serve 명령에서 프록시를 사용하는 것을 선호하지만이 구성을 angular.json에 다음 과 같이 넣을 수도 있습니다 .

"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "src/proxy.conf.json"
    },

또한보십시오:

https://www.techiediaries.com/fix-cors-with-angular-cli-proxy-configuration/

https://webpack.js.org/configuration/dev-server/#devserverproxy

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