Pregunta Access-Control-Allow-Origin Múltiples dominios de origen?


¿Hay alguna manera de permitir múltiples dominios cruzados usando el Access-Control-Allow-Origin ¿encabezamiento?

Soy consciente de *, pero es muy abierto. Realmente quiero permitir solo un par de dominios.

Como ejemplo, algo como esto:

Access-Control-Allow-Origin: http://domain1.example, http://domain2.example

He intentado con el código anterior, pero parece que no funciona en Firefox.

¿Es posible especificar varios dominios o me quedo con solo uno?


837
2017-10-31 03:27


origen


Respuestas:


Parece que la forma recomendada de hacerlo es hacer que su servidor lea el encabezado Origen del cliente, compararlo con la lista de dominios que le gustaría permitir y, si coincide, repetir el valor del Origin encabezado de vuelta al cliente como el Access-Control-Allow-Origin encabezado en la respuesta.

Con .htaccess puedes hacerlo así:

# ----------------------------------------------------------------------
# Allow loading of external fonts
# ----------------------------------------------------------------------
<FilesMatch "\.(ttf|otf|eot|woff)$">
    <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
    </IfModule>
</FilesMatch>

724
2017-12-05 00:10



Otra solución que estoy usando en 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");
}

165
2017-09-17 10:49



Esto funcionó para mí:

SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.example|domain2\.example)$" origin_is=$0 
Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is

Cuando lo pongas .htaccess, funcionará con seguridad.


98
2018-06-18 06:31



Tuve el mismo problema con woff-fonts, múltiples subdominios tuvieron que tener acceso. Para permitir subdominios, agregué algo como esto a mi 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>

Para dominios múltiples, puedes cambiar la expresión regular en SetEnvIf.


84
2018-05-18 12:46



A continuación, le mostramos cómo hacer un eco del encabezado de origen hacia atrás si coincide con su dominio con Nginx; esto es útil si desea publicar varios subdominios de fuente:

location /fonts {
    # this will echo back the origin header
    if ($http_origin ~ "example.org$") {
        add_header "Access-Control-Allow-Origin" $http_origin;
    }
}

55
2017-09-13 20:25



Esto es lo que hice para una aplicación PHP que está siendo solicitada por AJAX

$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);
}

Si mi servidor permite el origen solicitante, devuelva el $http_origin en sí mismo como valor de la Access-Control-Allow-Origin encabezado en lugar de devolver un * comodín.


22
2017-12-25 21:48



Hay una desventaja que debes tener en cuenta: tan pronto como saques tus archivos a un CDN (o cualquier otro servidor que no permita secuencias de comandos) o si tus archivos están en caché en un proxy, alterando la respuesta en función de 'Origen' el encabezado de solicitud no funcionará.


18
2018-02-20 19:18



Para múltiples dominios, en su .htaccess:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(domain1.example|domain2.example)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
</IfModule>

16
2018-03-11 16:51



Para IIS 7.5+ con el módulo URL Rewrite 2.0 instalado, consulte esta respuesta SO


14
2018-06-27 01:57