Access-Control-Allow-Origin은 오리진을 사용할 수 없습니다


337

Sencha Touch 2 응용 프로그램 ( PhoneGap에 싸여 있음)에서 Ajax.request원격 PHP 서버를 만들고 있습니다.

서버의 응답은 다음과 같습니다.

XMLHttpRequest가 http://nqatalog.negroesquisso.pt/login.php를 로드 할 수 없습니다 . 원산지는 http://localhost:8888액세스 제어 - 허용 - 원산지에 의해 허용되지 않습니다.

이 문제를 어떻게 해결할 수 있습니까?


19
jQuery를 사용하는 동안 설정 dataType: 'jsonp',은 트릭을 수행합니다
amit

11
그건 그렇고 그것은 서버의 응답이 아닙니다. 클라이언트 측에서 오류가 발생했다는 것을 정확하게하기 위해.
matteo

2
jsonp 트릭은 더 이상 작동하지 않을 것입니다 : stackoverflow.com/questions/12216208/…
drewww

7
이 버그를 추적하는 데 반나절을 낭비 했으므로 서버 측 스크립트가 내부 서버 오류로 실패하면 브라우저는 요청으로 인해 요청이 허용되지 않은 것으로 해석하여이를 Access-Control-Allow-Origin오류로보고 할 수 있습니다.
troelskn

1
@troelskn 당신은 내 생명을 구했습니다. 3 일 이후 CORS 실수를 찾고 있었고 500을 일으키는 작은 스프링 구성 문제 일뿐입니다. 이는 귀하의 의견을 읽고 실제로 찾은 후 5 분 안에 해결되었습니다. 감사합니다!
Alexis Dufrenoy

답변:


378

나는이 문제에 관한 기사를 얼마 전에 교차 도메인 AJAX 썼다 .

응답 서버를 제어 할 수있는 경우이를 처리하는 가장 쉬운 방법은 다음에 대한 응답 헤더를 추가하는 것입니다.

Access-Control-Allow-Origin: *

이것은 도메인 간 Ajax를 허용합니다 . PHP에서는 다음과 같이 응답을 수정하려고합니다.

<?php header('Access-Control-Allow-Origin: *'); ?>

Header set Access-Control-Allow-Origin *설정을 Apache 구성 또는 htaccess 파일 에 넣을 수 있습니다 .

이렇게하면 CORS 보호 기능이 효과적으로 비활성화되어 사용자가 공격에 노출 될 수 있습니다 . 와일드 카드를 사용해야한다는 사실을 모르는 경우에는 와일드 카드를 사용하지 말고 대신 특정 도메인을 허용 목록에 추가해야합니다.

<?php header('Access-Control-Allow-Origin: http://example.com') ?>

4
서버 제공 업체에 연락하겠습니다. 감사합니다
Ricardo

8
이것에 대한 보안 문제가 있습니까? 예를 들어, 이 답변 은 "JavaScript는 보안상의 이유로"동일한 원본 정책 "에 의해 제한됩니다. 예를 들어, 악의적 인 스크립트는 원격 서버에 접속하여 사이트에서 중요한 데이터를 보낼 수 없습니다."
JohnK

4
멋진 방금 이것을 내 node.js 서버 파일에 넣었습니다. response.writeHead (200, { 'Content-Type': contentType, 'Access-Control-Allow-Origin': '*'}); 그리고 효과가있었습니다. 감사!
vbullinger

25
JohnK, 예. 와일드 카드는 모든 도메인이 호스트에게 요청을 보낼 수 있도록 허용합니다. 별표를 스크립트를 실행할 특정 도메인으로 바꾸는 것이 좋습니다.
Nick

7
와일드 카드를 @jfrej로 제안해서는 안된다고 생각하는 것이 흥미 롭습니다. 그것은 모두 당신의 목표에 달려 있습니다. 예를 들어, 와일드 카드를 사용하고이 답변을 게시 한 이유는 모든 사이트에서 사용할 수있는 내장 위젯을 작성했기 때문입니다.
Matt Mombrea 12

63

서버를 제어 할 수없는 경우 Chrome 시작 관리자에이 인수를 추가하면 --disable-web-security됩니다.

일반적인 "웹 서핑"에는이 기능을 사용하지 않습니다. 자세한 내용은이 게시물 : Chrome에서 동일한 출처 정책 사용 안함을 참조하십시오 .

Phonegap을 사용하여 실제로 응용 프로그램을 빌드하고 장치에로드하는 것은 문제가되지 않습니다.


감사. 그러나 내 앱이 모바일 장치에서 실행 중이므로 웹보기 래퍼에 인수를 전달할 수 없습니다.
Ricardo

먼저 브라우저에서 앱을 테스트하지 않습니까? 어떻게 디버깅합니까?
트래비스 웹

예, Chrome 브라우저에서 디버깅하지만 앱은 크롬에서 실행되지 않습니다. 내가 통제 할 수없는 phonegap webview 마녀에있을 것입니다.
Ricardo

4
답을 읽으십시오 . Chrome 인수에 간단히이 인수를 추가 할 수 있습니다 . Chrome에는 이에 대한 설정이 없습니다.
Travis Webb

2
물론 안전하지 않습니다. OP는 보안 조치에 대한 방법을 요구하고 있습니다.
Travis Webb

42

Apache를 사용하는 경우 다음을 추가하십시오.

<ifModule mod_headers.c>
    Header set Access-Control-Allow-Origin: *
</ifModule>

구성에서. 인터넷의 다른 사이트에서 웹 서버의 모든 응답에 액세스 할 수 있습니다. 특정 서버에서 호스트의 서비스 만 사용하도록 *하려면 다음을 원래 서버의 URL로 바꿀 수 있습니다 .

Header set Access-Control-Allow-Origin: http://my.origin.host

3
그리고 모듈을로드하는 것을 잊지 마세요 : a2enmod 헤더
Walery Strauch

모듈을로드하는 방법 : a2enmod 헤더?
Ayesha

18

당신이있는 경우 ASP.NET / ASP.NET MVC의 응용 프로그램을, 당신은 Web.config 파일을 통해이 헤더를 포함 할 수 있습니다 :

<system.webServer>
  ...

    <httpProtocol>
        <customHeaders>
            <!-- Enable Cross Domain AJAX calls -->
            <remove name="Access-Control-Allow-Origin" />
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

2
.NET MVC People, 여기를보십시오! 실제로 솔루션을 입력하고 사람들이 쉽게 찾을 수 있도록 내 블로그에서이 답변을 가리킬 것입니다. .NET / MVC 장애물을 극복하고 PHP / jQuery 솔루션을 찾아내는 것보다 더 나쁜 것은 없습니다. 감사합니다 @ Caio-Proiete
ottoflux

1
이것이 어떻게 작동하지 않습니까? Chrome을 사용하고 있고 로컬 호스트에서 yahoo 금융 페이지에 액세스하려고합니다.
newman

1
고맙습니다. 서버 측 코드 프로젝트 (web.config)에 추가했습니다.
ethem

15

이것은 ASP.NET MVC 를 내 데이터 소스로 사용하여 동일한 문제를 해결하려고 할 때 나에게 나타난 첫 번째 질문 / 답변이었습니다 . 이것이 PHP 질문을 해결하지는 못하지만 가치가있을 정도로 관련 이 있다는 것을 알고 있습니다.

ASP.NET MVC를 사용하고 있습니다. Greg Brant블로그 게시물 이 저에게 도움이되었습니다. 궁극적 [HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]으로 컨트롤러 작업에 추가 할 수 있는 속성을 만듭니다 .

예를 들면 다음과 같습니다.

public class HttpHeaderAttribute : ActionFilterAttribute
{
    public string Name { get; set; }
    public string Value { get; set; }
    public HttpHeaderAttribute(string name, string value)
    {
        Name = name;
        Value = value;
    }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        filterContext.HttpContext.Response.AppendHeader(Name, Value);
        base.OnResultExecuted(filterContext);
    }
}

그런 다음 다음과 함께 사용하십시오.

[HttpHeaderAttribute("Access-Control-Allow-Origin", "*")]
public ActionResult MyVeryAvailableAction(string id)
{
    return Json( "Some public result" );
}

1
WebApi 2는 현재 내장되어 있습니다. asp.net/web-api/overview/security/…
Matt Frear

10

Matt Mombrea가 서버 측에 적합하므로 거부를 허용하는 다른 문제가 발생할 수 있습니다.

phonegap.plist를 구성해야합니다. (이전 버전의 phonegap을 사용하고 있습니다)

cordova의 경우, 이름 및 디렉토리에 일부 변경 사항이있을 수 있습니다. 그러나 단계는 대부분 동일해야합니다.

먼저 지원 파일> PhoneGap.plist를 선택하십시오.

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

"외부 호스트"에서

아마도 " http://nqatalog.negroesquisso.pt " 값을 가진 항목을 추가하십시오 . 디버깅 목적으로 만 *를 사용하고 있습니다.

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


8

이는 'www'및 'www가 아닌'버전의 리퍼러 모두에 대해 예외가 필요한 사용자에게 유용 할 수 있습니다.

 $referrer = $_SERVER['HTTP_REFERER'];
 $parts = parse_url($referrer);
 $domain = $parts['host'];

 if($domain == 'google.com')
 {
         header('Access-Control-Allow-Origin: http://google.com');
 }
 else if($domain == 'www.google.com')
 {
         header('Access-Control-Allow-Origin: http://www.google.com');
 }

하늘빛으로 ACAO 오류를 해결하는 데 올바른 방향을 제시했습니다. 허용되는 googledrive의 호스트 이름을 추가했지만 URL은 할 필요를 사용 하며, Google NOT , Google 드라이브
Kildareflare

7

나는 이것에 대한 간단한 해결책을 줄 것이다. 내 경우에는 서버에 액세스 할 수 없습니다. 이 경우 Google Chrome 브라우저 의 보안 정책을 변경하여 Access-Control-Allow-Origin을 허용 할 수 있습니다. 이것은 매우 간단합니다.

  1. Chrome 브라우저 바로 가기 만들기
  2. 바로 가기 아이콘-> 속성-> 바로 가기-> 대상을 마우스 오른쪽 버튼으로 클릭하십시오.

간단한 붙여 넣기 "C:\Program Files\Google\Chrome\Application\chrome.exe" --allow-file-access-from-files --disable-web-security.

위치가 다를 수 있습니다. 바로 가기를 클릭하여 Chrome을 엽니 다.



6

확실히 당신은 당신에게 API의 기본 URL을 추가 한이 오류가 크롬 확장을 작성하고 얻을 경우, 다음 수 manifest.json권한 블록 예 :

"permissions": [
    "https://itunes.apple.com/"
]

6

이는 동일한 출처 정책 때문입니다 . Mozilla 개발자 네트워크 또는 Wikipedia 에서 더 많은 것을보십시오 .

기본적으로 귀하의 예에서는 , not http://nqatalog.negroesquisso.pt/login.php에서만 페이지를 로드해야합니다 .nqatalog.negroesquisso.ptlocalhost


1
그러나 모바일 장치에서 웹 서비스를로드해야합니다.이를 우회 하시겠습니까?
Ricardo

서버 측을 약간 변경하거나 JSONP를 사용해야합니다. en.wikipedia.org/wiki/JSONP
antyrat

6

아파치 상태라면 다음 내용으로 디렉토리에 .htaccess 파일을 추가하십시오.

Header set Access-Control-Allow-Origin: *

Header set Access-Control-Allow-Headers: content-type

Header set Access-Control-Allow-Methods: *

5

에서 루비 온 레일즈 , 당신은 컨트롤러에서 수행 할 수 있습니다

headers['Access-Control-Allow-Origin'] = '*'

아약스 호출 인 경우 어떤 컨트롤러를 넣습니까? 더 많은 코드 컨텍스트를 볼 수 있습니까?
rigdonmr


5

Angular.js에서 이것을 얻는다면 다음과 같이 포트 번호를 피하십시오 :

var Project = $resource(
    'http://localhost\\:5648/api/...', {'a':'b'}, {
        update: { method: 'PUT' }
    }
);

자세한 내용은 여기 를 참조 하십시오 .


4

Chrome에서 테스트 한 phonegap 응용 프로그램에도 동일한 문제가 있습니다. Chrome을 열기 전에 매일 배치 파일 아래에서 사용하는 하나의 Windows 컴퓨터 이를 실행하기 전에 작업 관리자에서 모든 크롬 인스턴스를 정리해야하거나 백그라운드에서 실행되지 않도록 크롬을 선택할 수 있습니다.

배치 : (cmd 사용)

cd D:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security


0

요청을 받으면

var origin = (req.headers.origin || "*");

응답해야 할 때보 다 다음과 같이하십시오.

res.writeHead(
    206,
    {
        'Access-Control-Allow-Credentials': true,
        'Access-Control-Allow-Origin': origin,
    }
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.