.htaccess의 헤더 세트 Access-Control-Allow-Origin이 작동하지 않습니다.


91

.htaccess헤더 설정이 작동하지 않는 이유를 알 수 없습니다 .

.htaccess파일 내용 :

Header set Access-Control-Allow-Origin *
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Allow-Headers "*"
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]

그러나 내가을 제거 Header하고 추가하면 index.php모든 것이 잘 작동합니다.

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: PUT, GET, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: *");

내가 무엇을 놓치고 있습니까?

답변:


135

이것은 작동합니다.

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

46
아파치 모듈 헤더를 활성화하는 것을 잊지 마세요a2enmod headers
루카스 세라핌에게

1
수정 됨 : "Access-Control-Allow-Methods에서 메소드 PUT를 허용하지 않음"
Rahul Prasad

6
또한 Header set이 경우 에 사용하는 것이 가장 좋습니다 . 코드가 변경되고 헤더를 설정하는 경우 Apache가 수행하면 header add더블 ** 헤더가 전송됩니다. 예를 들어 Restangular와 같은 클라이언트가 손상됩니다.
Julian

2
필요한 경우, 잊지 마세요,Header add Access-Control-Allow-Credentials "true"
마르코 마르 살라

20

기록을 위해 똑같은 문제가 발생했으며 어떤 답변도 효과가 없었습니다.

헤더 검사기 도구를 사용했습니다. http://www.webconfs.com/http-header-check.php

내 IP ( http://192.0.2.1/upload) 로 테스트하고 있었는데 결과 는 다음과 같습니다.

HTTP/1.1 301 Moved Permanently => 
Date => Sat, 10 Jan 2015 04:03:35 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
Location => http://192.0.2.1/upload/
Content-Length => 380
Connection => close
Content-Type => text/html; charset=iso-8859-1

리디렉션이 발생했으며 AJAX 요청이 리디렉션을 따르거나 따르지 않습니다.

도메인 끝에 슬래시가 누락 된 것으로 밝혀졌습니다 ( http://192.0.2.1/upload / )

마지막에 슬래시로 다시 테스트했으며 아래에 이것을 얻었습니다. 스크립트에도 슬래시를 추가했으며 이제 작동 중입니다.

HTTP/1.1 200 OK => 
Date => Sat, 10 Jan 2015 04:03:53 GMT
Server => Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By => PHP/5.3.8
Access-Control-Allow-Origin => *
Access-Control-Allow-Methods => PUT, GET, POST, DELETE, OPTIONS
Access-Control-Allow-Headers => *
Content-Length => 1435
Connection => close
Content-Type => text/html

이 도구를 사용하여 헤더가 양호한 지 테스트하고 발생하는 문제를 해결하세요.


5
이 문제를 해결하기 위해 지금 11 개의 탭이 열려 있습니다. 이 대답은 더 많은 곳에 있어야합니다.
JDavis

제 경우에는 후행 슬래시를 제거해야했습니다. 이걸 발견해서 기뻐요. 몇 시간 전에 작업 했어야했을 때이 문제를 해결하는 데 너무 많은 시간을 보냈습니다.
gorelog

11

GoDaddy에 공유 호스팅이 있습니다. 나도이 질문에 대한 답이 필요했고 주변을 검색 한 결과 가능하다는 것을 알았습니다.

.htaccess 파일을 작성하여 작업 페이지와 동일한 폴더에 넣었습니다. .htaccess 파일의 내용은 다음과 같습니다.

Header add Access-Control-Allow-Origin "*"
Header add Access-Control-Allow-Headers "origin, x-requested-with, content-type"
Header add Access-Control-Allow-Methods "PUT, GET, POST, DELETE, OPTIONS"

내 ajax 호출은 다음과 같습니다.

    $.ajax({
        url: 'http://www.mydomain.com/myactionpagefolder/gbactionpage.php',  //server script to process data
        type: 'POST',
        xhr: function() {  // custom xhr
            myXhr = $.ajaxSettings.xhr();
            if(myXhr.upload){ // check if upload property exists
                myXhr.upload.addEventListener('progress',progressHandlingFunction, false); // for handling the progress of the upload
            }
            return myXhr;
        },
        //Ajax events
        beforeSend: beforeSendHandler,
        success: completeHandler,
        error: errorHandler,
        // Form data
        data: formData,
        //Options to tell JQuery not to process data or worry about content-type
        cache: false,
        contentType: false,
        processData: false
    });

이 기사를 참조하십시오.

.htaccess의 헤더 세트 Access-Control-Allow-Origin이 작동하지 않습니다.


8

다음에주의하십시오.

 Header add Access-Control-Allow-Origin "*"

모든 사람에게 액세스 권한을 부여하는 것은 전혀 현명하지 않습니다. 알고있는 신뢰할 수있는 호스트 목록 만 허용하는 것이 좋습니다.

Header add Access-Control-Allow-Origin "http://aaa.example"
Header add Access-Control-Allow-Origin "http://bbb.example"
Header add Access-Control-Allow-Origin "http://ccc.example"

문안 인사,


3
작동하지 않습니다. Access-Control-Allow-Origin에는 여러 값이 허용되지 않습니다. Origin 요청 헤더의 값에 따라 동적으로 헤더를 설정해야합니다.
Quentin

7

Apache 모듈 헤더 a2enmod 헤더를 활성화했으며 문제가 해결되었습니다.


로그의 오류는 내가 변경 한 내용이 실패하는 이유에 대해 명확하지 않았으며이 답변이 큰 도움이되었습니다. sudo a2enmod headers다시 시작하면 작동합니다!
cchana

3

외부 루트 폴더의 .htaccess에서 시도하십시오.

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

주의 사항 : Header add Access-Control-Allow-Origin "*"이것은 모든 사람에게 액세스 권한을 부여하는 데 전혀 현명하지 않습니다. 다음을 사용해야한다고 생각합니다.

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "http://example.com"
</IfModule>

3

헤더 검사기 사이트 http://www.webconfs.com/http-header-check.php 에 대한 링크에 대한 Miro의 답변을 +1했습니다 . 사용할 때마다 불쾌한 광고가 표시되지만 그럼에도 불구하고 Access-Control-Allow-Origin 헤더가 있는지 확인하는 데 매우 유용합니다.

내 웹 페이지의 javascript에서 .json 파일을 읽고 있습니다. 내 .htaccess 파일에 다음을 추가하면 IE 11 (버전 11.447.14393.0)에서 내 웹 페이지를 볼 때 문제가 해결되는 것으로 나타났습니다.

<FilesMatch "\.(json)$">
  <IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>
</FilesMatch>

또한 /etc/httpd.conf(Apache의 구성 파일)에 다음을 추가했습니다.

AllowOverride All

헤더 검사기 사이트는 Access-Control-Allow-Origin 헤더가 현재 전송되고 있음을 확인했습니다 (Miro에게 감사합니다!).

그러나 Firefox 50.0.2, Opera 41.0.2353.69 및 Edge 38.14393.0.0 은 Access-Control-Allow-Origin 헤더 없이도 파일을 모두 가져옵니다 . (참고 : 내가 사용한 두 도메인이 동일한 IPv4 주소의 동일한 서버에서 호스팅되기 때문에 IP 주소를 확인하고있을 수 있습니다.)

그러나 Chrome 54.0.2840.99m (64 비트)는 Access-Control-Allow-Origin 헤더를 무시하고 실패하고 다음과 같이 잘못보고합니다.

요청 된 리소스에 'Access-Control-Allow-Origin'헤더가 없습니다. 따라서 ' {mydomain} ' 원본 은 액세스가 허용되지 않습니다.

나는 이것이 일종의 "처음"이어야한다고 생각한다. IE가 올바르게 작동합니다. Chrome, Firefox, Opera 및 Edge는 모두 버그가 있습니다. 그리고 Chrome은 최악 입니다. 일반적인 경우와 정반대가 아닌가?


0

아무것도 작동하지 않고 반나절을 보낸 후. 모든 것이 작동했지만 헤더 검사 서비스를 사용했습니다. 직장에서 방화벽이 그들을 제거하고 있었다


0

이 시도:

<IfModule mod_headers.c>
     Header set Access-Control-Allow-Credentials true
     Header set Access-Control-Allow-Origin "your domain"
     Header set Access-Control-Allow-Headers "X-Requested-With"
</IfModule>

알려진 신뢰할 수있는 호스트 목록을 허용하는 것이 좋습니다.


0

다른 사람이 이것을 시도하는 경우 가장 찬성 응답이 작동합니다. 그러나 문제가있는 경우 브라우저가 REQUEST를 캐시했을 수 있습니다. 확인하려면 쿼리 문자열을 추가하십시오.

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