[.htaccess] 출입 통제 허용 원산지 도메인?

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 (또는 스크립팅을 허용하지 않는 다른 서버)에 아웃소싱하거나 파일이 프록시에 캐시 된 경우 ‘원본’에 따라 응답이 변경됩니다 요청 헤더가 작동하지 않습니다.