요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. 따라서 원점 '…'은 액세스 할 수 없습니다


135

.htaccess를 사용하여 URL을 다시 작성하고 html 기본 태그를 사용하여 URL을 작동시킵니다.

이제 아약스 요청을하려고하면 다음 오류가 발생합니다.

XMLHttpRequest를로드 할 수 없습니다 http://www.example.com/login.php. 요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. http://example.com따라서 원점 ' '은 액세스 할 수 없습니다.


1
신경 쓰지 마 ... 그것은 지금 일하고있다, 나는 실수가 무엇인지조차 모른다 : S
Th3lmuu90

8
미묘한 입력해도, http://wordicious.comA는 다른 도메인 에 비해 http://www.wordicious.com/, 따라서 오류입니다. Btw, 지금 작동하고 자체적으로 돌아왔다면 아마도 질문을 삭제해야합니다.
acdcjunior

@acdcjunior 그것은 오류 인 것 같습니다. 당신이 답변으로 게시하면 나는 그것을 찬성합니다.
Waleed Khan

5
질문이 삭제되지 않았거나 오늘 보지 못했을 것입니다.
icedwater

답변:


170

사용 방법 addHeader대신에setHeader

response.addHeader("Access-Control-Allow-Origin", "*");

*위의 줄에서 허용 access to all domains됩니다.


허용 access to specific domain only:

response.addHeader("Access-Control-Allow-Origin", "http://www.example.com");

이것을 확인하십시오 blog post.


4
addheader가 정의되지 않았습니다. 설명해 주시겠습니까?
Vaisakh Pc

9
이 줄은 어디에 두나요?
DaveWalley

14
이것을 어디에 추가해야합니까?
Alex

1
그 블로그 포스트는 Node.js와 표현에 대해 이야기하고 있습니다. 클라이언트 측 자바 스크립트가 아닙니다. 이것이 작동하는지 누구나 확인할 수 있습니까?
Sam Eaton

1
이 설정은 클라이언트 측에서만 가능하다고 생각하지 않습니다. 어디에 넣을 것인지는 서버 측 코드에있을 것입니다. (요청에 대한 응답을 구축 할 때)
Chirag Ravindra

145

오류가 발생하는 이유 :

자바 스크립트 코드는에 의해 제한되는 동일 출처 정책 에서 페이지에서, 의미 www.example.com, 당신은 단지에있는 서비스 (AJAX) 요청 할 수 있습니다 정확히 정확하게,이 경우, 동일한 도메인을 www.example.com( 하지 example.com - 않고 www- 나 whatever.example.com).

귀하의 경우 Ajax 코드가에 http://wordicious.com있는 페이지에서 서비스를 받으려고합니다 http://www.wordicious.com.

매우 유사하지만 동일한 도메인 이 아닙니다 . 그리고 그들이 같은 도메인에 있지 않은 경우, 요청은 대상의 respose에 Access-Control-Allow-Origin헤더가 포함 된 경우에만 성공 합니다.

의 페이지 / 서비스 http://wordicious.com가 이러한 헤더를 표시하도록 구성되지 않았으므로 해당 오류 메시지가 표시됩니다.

해결책:

앞에서 설명한 것처럼 JavaScript가있는 페이지가있는 원점과 JavaScript가 도달하려는 대상 도메인이 정확히 같아야합니다.

당신의 경우는 오타처럼 보입니다. 모양 http://wordicious.comhttp://www.wordicious.com실제로는 동일한 서버 / 도메인입니다. 따라서 수정하려면 대상과 원점을 동일하게 입력하십시오. Ajax 코드 요청 페이지 / 서비스를 http://www.wordicious.com하지 말아야http://wordicious.com 합니다. ( '/login.php'도메인없이 타겟 URL을 상대적으로 배치하십시오 ).



보다 일반적인 참고 사항 :

문제가이 질문 중 하나와 같은 오타가 아닌 경우 해결책은 대상 도메인에추가하는Access-Control-Allow-Origin 것 입니다. 물론 추가하려면 해당 주소 뒤에있는 서버 / 언어에 따라 다릅니다. 때로는 도구의 구성 변수가 트릭을 수행합니다. 다른 경우에는 코드를 통해 헤더를 직접 추가해야합니다.


62

.NET 서버의 경우 아래와 같이 web.config에서이를 구성 할 수 있습니다.

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="your_clientside_websiteurl" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>

예를 들어 서버 도메인이 http://live.makemypublication.com 이고 클라이언트가 http://www.makemypublication.com 이면 서버의 web.config에서 아래와 같이 구성 하십시오.

 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="http://www.makemypublication.com" />
     </customHeaders>
  </httpProtocol>
 </system.webServer>

더 나은 솔루션. 감사합니다
ANJYR-KODEXPRESSION

고마워 당신은 하루 종일 저를 구했습니다.
Prateek Gupta

2 년이 지난 후에도 일함 : p
유비쿼터스 개발자들

1
@SyedAliTaqi 질문은 PHP이므로 답변이 과소 평가됩니다. 그러나 그것은 또한 나를 위해 일했다 :)
Ahmad Th

22

브라우저에서이 오류 메시지가 표시되는 경우 :

요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. 따라서 원점 '…'은 액세스 할 수 없습니다

제어 할 수없는 원격 서버에 Ajax POST / GET 요청을 수행하려고 할 때이 간단한 수정 사항을 잊어 버리십시오.

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

특히 Ajax 요청을 수행하기 위해 JavaScript 만 사용하는 경우 실제로 수행해야하는 것은 쿼리를 가져 와서 원격 서버로 전송하는 내부 프록시입니다.

먼저 JavaScript에서 다음과 같은 자체 서버에 대한 Ajax 호출을 수행하십시오.

$.ajax({
    url: yourserver.com/controller/proxy.php,
    async:false,
    type: "POST",
    dataType: "json",
    data: data,
    success: function (result) {
        JSON.parse(result);
    },
    error: function (xhr, ajaxOptions, thrownError) {
        console.log(xhr);
    }
});

그런 다음, proxy.php라는 간단한 PHP 파일을 작성하여 POST 데이터를 랩핑하고이를 원격 URL 서버에 매개 변수로 추가하십시오. Expedia Hotel 검색 API에서이 문제를 우회하는 방법에 대한 예를 제공합니다.

if (isset($_POST)) {
  $apiKey = $_POST['apiKey'];
  $cid = $_POST['cid'];
  $minorRev = 99;

  $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?' . 'cid='. $cid . '&' . 'minorRev=' . $minorRev . '&' . 'apiKey=' . $apiKey;

  echo json_encode(file_get_contents($url));
 }

함으로써 :

 echo json_encode(file_get_contents($url));

동일한 쿼리를 수행하지만 서버 측에서 수행 한 후 정상적으로 작동합니다.


@NizarBsb 당신은 미쳤다는 것을 알고 있습니다 !!!!! : D, 덕분에 많은 당신의 대답은 내 인생 저장
플래시

10

PHP 페이지 "login.php"의 시작 부분에 이것을 추가해야합니다

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

5
확실히 안전하지 않습니다.
콜백

7

옵션 메소드 응답에 헤더 키 / 값을 넣어야합니다. 예를 들어 http://mydomain.com/myresource에 리소스 가 있으면 서버 코드에 다음을 작성하십시오.

//response handler
void handleRequest(Request request, Response response) {
    if(request.method == "OPTIONS") {
       response.setHeader("Access-Control-Allow-Origin","http://clientDomain.com")
       response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
       response.setHeader("Access-Control-Allow-Headers", "Content-Type");
    }



}

3

기본적으로 다음 추가 매개 변수를 추가하여 API 헤더 응답을 변경하십시오.

액세스 제어 허용 자격 증명 : true

액세스 제어 허용 출처 : *

그러나 이것은 보안과 관련하여 좋은 해결책이 아닙니다.


3

해결 방법은 '소스'호스트에서 실행되고 Fiddler와 같은 대상 서버로 전달하는 리버스 프록시를 사용하는 것입니다.

여기 링크 : http://docs.telerik.com/fiddler/configure-fiddler/tasks/usefiddlerasreverseproxy

또는 Apache Reverse 프록시 ...


도메인의 Apache 또는 Nginx 구성 수준에서 수행 할 수 있습니다. 예를 들어 사용자가 mysite.com에 액세스하고 (www 없음) XHR이 www.mysite.com을 요청하는 경우 htaccess 또는 httpd.conf 지시문이이를 해결할 수 있습니까?
codecowboy

물론 프론트 엔드 앱은 리버스 프록시로 동작해야합니다. 예를 들어 Apache의 경우 mod_proxy를 설치하고 ProxyPassReverse ( httpd.apache.org/docs/current/mod/… )를 사용하여 규칙을 구성해야합니다 . Nginx에서도 동일한 기능을 사용할 수 있습니다. wiki.nginx.org/LikeApache
hzrari

2

PHP 파일 또는 메인 컨트롤러에 추가하십시오

header("Access-Control-Allow-Origin: http://localhost:9000");

마무리 – 당신도 필요header("Access-Control-Allow-Credentials: true");
Adam

1

httpd.conf의 아래 항목으로 해결되었습니다.

#CORS Issue
Header set X-Content-Type-Options "nosniff"
Header always set Access-Control-Max-Age 1728000
Header always set Access-Control-Allow-Origin: "*"
Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT,PATCH"
Header always set Access-Control-Allow-Headers: "DNT,X-CustomHeader,Keep-Alive,Content-Type,Origin,Authentication,Authorization,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control"
Header always set Access-Control-Allow-Credentials true

#CORS REWRITE
RewriteEngine On                  
RewriteCond %{REQUEST_METHOD} OPTIONS 
#RewriteRule ^(.*)$ $1 [R=200,L]
RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

아파치, CentOS7, Larravel 5에 나를 위해 일한와 반응하는 유일한 방법
Shakiba Moshiri

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