PHP 헤더가있는 CORS (Cross-Origin Request Headers)


146

도메인 간 CORS 요청을 시도하는 간단한 PHP 스크립트가 있습니다.

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: *");
...

그러나 여전히 오류가 발생합니다.

요청 헤더 필드 X-Requested-With는 허용되지 않습니다.Access-Control-Allow-Headers

내가 놓친 게 있습니까?

답변:


59

Access-Control-Allow-Headers허용 *되는 값으로 허용 되지 않는 경우 여기 에서 Mozilla 문서를 참조 하십시오 .

별표 대신 허용 된 헤더를 보내야합니다 (먼저 X-Requested-With오류가 표시 한대로)


289

CORS 요청을 올바르게 처리하는 것은 다소 복잡합니다. 다음은보다 완전하고 적절하게 응답하는 기능입니다.

/**
 *  An example CORS-compliant method.  It will allow any GET, POST, or OPTIONS requests from any
 *  origin.
 *
 *  In a production environment, you probably want to be more restrictive, but this gives you
 *  the general idea of what is involved.  For the nitty-gritty low-down, read:
 *
 *  - https://developer.mozilla.org/en/HTTP_access_control
 *  - http://www.w3.org/TR/cors/
 *
 */
function cors() {

    // Allow from any origin
    if (isset($_SERVER['HTTP_ORIGIN'])) {
        // Decide if the origin in $_SERVER['HTTP_ORIGIN'] is one
        // you want to allow, and if so:
        header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Max-Age: 86400');    // cache for 1 day
    }

    // Access-Control headers are received during OPTIONS requests
    if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

        if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
            // may also be using PUT, PATCH, HEAD etc
            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);
    }

    echo "You have CORS!";
}

32
HTTP 오리진 값을 허용 된 오리진으로 다시 보내면 누구나 쿠키를 사용하여 요청을 보낼 수 있으므로 사이트에 로그인 한 사용자로부터 세션을 훔쳐 공격자의 페이지를 볼 수 있습니다. '*'(쿠키를 허용하지 않아 세션 도용을 방지 함) 또는 사이트를 작동시키려는 특정 도메인을 보내려고합니다.
Jules

1
동의했다. 실제로 이전 도메인 만 CORS 서비스를 사용하도록 허용하지 않았을 것이므로 신뢰하기로 결정한 일부 세트로 제한 할 것입니다.
슬래 싱 무기

참고로,이 솔루션은 단지 나를 위해 일 Linux server에, IIS단지 작동하지 않았다 몇 가지 이유로 그 내 호스팅 나도 몰라요 아니면 적합하지 그냥IIS
ncubica

1
감사합니다! 이 답변을 북마크해야합니다. 우리는 이것을 새로운 답변으로 표시 할 수 없습니다
Ascherer

1
유일한 그의 진정한 작업 .. 그냥 변화 액세스 제어 - 허용 - 원산지 : * TO 액세스 제어 - 허용 - 원산지 :! {$ _SERVER [ 'HTTP_ORIGIN']}
르낭 프란카

60

같은 오류가 발생하여 백엔드 스크립트에서 다음 PHP로 수정했습니다.

header('Access-Control-Allow-Origin: *');

header('Access-Control-Allow-Methods: GET, POST');

header("Access-Control-Allow-Headers: X-Requested-With");

35

인터넷 전체의 많은 설명에서는 지정 Access-Control-Allow-Origin이 충분 하지 않다고 언급 하지 않습니다. 다음은 나에게 맞는 완전한 예입니다.

<?php
    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        header('Access-Control-Allow-Origin: *');
        header('Access-Control-Allow-Methods: POST, GET, DELETE, PUT, PATCH, OPTIONS');
        header('Access-Control-Allow-Headers: token, Content-Type');
        header('Access-Control-Max-Age: 1728000');
        header('Content-Length: 0');
        header('Content-Type: text/plain');
        die();
    }

    header('Access-Control-Allow-Origin: *');
    header('Content-Type: application/json');

    $ret = [
        'result' => 'OK',
    ];
    print json_encode($ret);

1
이 충분하지 않습니다 어떤 최소한의 예를하는 이유를 설명하십시오 이다 충분.
halfpastfour.am 오전

불행히도, 나는 정확하게 기억하지 못하고 그것을 다시 조사 할 시간이 없지만, 내가 기억하는 한, 웹 서버 / 브라우저 측에서 작동하지 않는 몇 가지 기본 가정이있었습니다. 이것은 나를 위해 일한 최소한의 코드였습니다.
Csongor Halmai

24

나는이 수정 프로그램 (angularjs + PHP 백엔드)과 함께 작동하기 위해 dropzone 및 기타 플러그인을 얻었습니다.

 header('Access-Control-Allow-Origin: *'); 
    header("Access-Control-Allow-Credentials: true");
    header('Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS');
    header('Access-Control-Max-Age: 1000');
    header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization');

이것을 upload.php에 추가하거나 요청을 보낼 위치에 추가하십시오 (예를 들어 upload.html이 있고 파일을 upload.php에 첨부 한 다음이 4 줄을 복사하여 붙여 넣으십시오). 또한 Chrome / mozilla에서 CORS 플러그인 / 애드온을 사용하는 경우 CORS를 사용하도록 설정하려면 한 번 이상 전환해야합니다.


15

PHP에서 CORS 서비스를 작성하려면이 코드를 파일에서 요청을 처리하는 첫 번째 단계로 사용할 수 있습니다.

// Allow from any origin
if(isset($_SERVER["HTTP_ORIGIN"]))
{
    // You can decide if the origin in $_SERVER['HTTP_ORIGIN'] is something you want to allow, or as we do here, just allow all
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
}
else
{
    //No HTTP_ORIGIN set, so we allow any. You can disallow if needed here
    header("Access-Control-Allow-Origin: *");
}

header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 600");    // cache for 10 minutes

if($_SERVER["REQUEST_METHOD"] == "OPTIONS")
{
    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_METHOD"]))
        header("Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT"); //Make sure you remove those you do not want to support

    if (isset($_SERVER["HTTP_ACCESS_CONTROL_REQUEST_HEADERS"]))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

    //Just exit with 200 OK with the above headers for OPTIONS method
    exit(0);
}
//From here, handle the request as it is ok

8

CORS가 제대로 작동하지 않으면 두통이 될 수 있습니다. PHP에서 사용하고 문제없이 작동합니다. 여기 참조

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Max-Age: 1000");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");
header("Access-Control-Allow-Methods: PUT, POST, GET, OPTIONS, DELETE");

7

각도 4를 클라이언트 측으로 사용하고 PHP를 서버 측으로 사용할 때이 많은 코드가 작동하지 않습니다.

header("Access-Control-Allow-Origin: *");

3

이 작동합니다

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: X-Requested-With, Content-Type, Origin, Cache-Control, Pragma, Authorization, Accept, Accept-Encoding");

0

이 코드를 .htaccess에 추가하십시오.

app_key, auth_key..etc와 같은 헤더에 사용자 정의 인증 키를 추가하십시오.

Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Headers: "customKey1,customKey2, headers, Origin, X-Requested-With, Content-Type, Accept, Authorization"

-1

Windows 에서 코드를 테스트 할 시간 동안 만이 창 을 실행 창 에 붙여 넣으십시오.

chrome.exe --user-data-dir = "C : / Chrome 개발 세션"--disable-web-security


일시적인 경우에도 브라우저의 웹 보안을 비활성화하는 것은 끔찍한 생각입니다.
행동
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.