Access-Control-Allow-Origin
헤더를 사용하여 여러 교차 도메인을 허용하는 방법이 있습니까?
에 대해 알고 *
있지만 너무 열려 있습니다. 정말 몇 개의 도메인 만 허용하고 싶습니다.
예를 들면 다음과 같습니다.
Access-Control-Allow-Origin: http://domain1.example, http://domain2.example
위의 코드를 시도했지만 Firefox에서 작동하지 않는 것 같습니다.
여러 도메인을 지정할 수 있습니까? 아니면 하나만 고집 할 수 있습니까?
답변
권장되는 방법은 서버가 클라이언트에서 Origin 헤더를 읽고 허용하려는 도메인 목록과 비교하고 일치하는 경우 Origin
헤더 값을 클라이언트에 다시 에코하는 것입니다. Access-Control-Allow-Origin
응답 의 헤더
.htaccess
당신은 이렇게 할 수 있습니다 :
# ----------------------------------------------------------------------
# Allow loading of external fonts
# ----------------------------------------------------------------------
<FilesMatch "\.(ttf|otf|eot|woff|woff2)$">
<IfModule mod_headers.c>
SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.example|dev02.otherdomain.example)$" AccessControlAllowOrigin=$0
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
Header merge Vary Origin
</IfModule>
</FilesMatch>
답변
PHP에서 사용중인 다른 솔루션 :
$http_origin = $_SERVER['HTTP_ORIGIN'];
if ($http_origin == "http://www.domain1.com" || $http_origin == "http://www.domain2.com" || $http_origin == "http://www.domain3.com")
{
header("Access-Control-Allow-Origin: $http_origin");
}
답변
이것은 나를 위해 일했다 :
SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.example|domain2\.example)$" origin_is=$0
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is
에 넣으면 .htaccess
확실히 작동합니다.
답변
woff-fonts와 동일한 문제가 있었으며 여러 하위 도메인에 액세스해야했습니다. 하위 도메인을 허용하기 위해 httpd.conf에 다음과 같은 내용을 추가했습니다.
SetEnvIf Origin "^(.*\.example\.com)$" ORIGIN_SUB_DOMAIN=$1
<FilesMatch "\.woff$">
Header set Access-Control-Allow-Origin "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN
</FilesMatch>
여러 도메인의 경우 정규 표현식을에서 변경할 수 있습니다 SetEnvIf
.
답변
도메인이 Nginx와 일치하는 경우 Origin 헤더를 다시 에코하는 방법은 다음과 같습니다. 여러 하위 도메인에 글꼴을 제공하려는 경우에 유용합니다.
location /fonts {
# this will echo back the origin header
if ($http_origin ~ "example.org$") {
add_header "Access-Control-Allow-Origin" $http_origin;
}
}
답변
다음은 AJAX에서 요청하는 PHP 응용 프로그램에서 수행 한 작업입니다.
$request_headers = apache_request_headers();
$http_origin = $request_headers['Origin'];
$allowed_http_origins = array(
"http://myDumbDomain.example" ,
"http://anotherDumbDomain.example" ,
"http://localhost" ,
);
if (in_array($http_origin, $allowed_http_origins)){
@header("Access-Control-Allow-Origin: " . $http_origin);
}
요청한 오리진이 서버에서 허용되는 경우 와일드 카드 를 반환하는 대신 헤더 $http_origin
값으로 자체 Access-Control-Allow-Origin
를 반환합니다 *
.
답변
주의해야 할 한 가지 단점이 있습니다. 파일을 CDN (또는 스크립팅을 허용하지 않는 다른 서버)에 아웃소싱하거나 파일이 프록시에 캐시 된 경우 ‘원본’에 따라 응답이 변경됩니다 요청 헤더가 작동하지 않습니다.