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

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

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

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

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



답변

나는이 문제에 관한 기사를 얼마 전에 교차 도메인 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') ?>


답변

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

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

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


답변

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

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

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

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


답변

당신이있는 경우 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>


답변

이것은 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" );
}


답변

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

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

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

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

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

“외부 호스트”에서

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

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


답변

이는 ‘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');
 }