Basado en la respuesta de DaveRandom , también estaba jugando y encontré una solución de Apache un poco más simple que produce el mismo resultado ( Access-Control-Allow-Origin
se establece en el protocolo específico actual + dominio + puerto dinámicamente) sin usar ninguna regla de reescritura:
SetEnvIf Origin ^(https?://.+\.mywebsite\.com(?::\d{1,5})?)$ CORS_ALLOW_ORIGIN=$1
Header append Access-Control-Allow-Origin %{CORS_ALLOW_ORIGIN}e env=CORS_ALLOW_ORIGIN
Header merge Vary "Origin"
Y eso es.
Aquellos que quieran habilitar CORS en el dominio principal (por ejemplo, mywebsite.com) además de todos sus subdominios pueden simplemente reemplazar la expresión regular en la primera línea con esta:
^(https?://(?:.+\.)?mywebsite\.com(?::\d{1,5})?)$
.
Nota: Para el cumplimiento de las especificaciones y el comportamiento de almacenamiento en caché correcto, SIEMPRE agregue el Vary: Origin
encabezado de respuesta para los recursos habilitados para CORS, incluso para las solicitudes que no son de CORS y aquellas de un origen no permitido (ver ejemplo por qué ).
//
en este contexto, ya que la configuración de Apache no utiliza expresiones regulares delimitadas por barras. Regexr se queja porque, en ese contexto, las barras tienen un significado especial como delimitadores.The 'Access-Control-Allow-Origin' header contains multiple values '^(https?://(?:.+.)?aerofotea.com(?::d{1,5})?)$', but only one is allowed. Origin 'http://local.aerofotea.com' is therefore not allowed access.
La especificación CORS es todo o nada. Sólo es compatible con
*
,null
o la exacta protocolo + dominio + puerto: http://www.w3.org/TR/cors/#access-control-allow-origin-response-headerSu servidor necesitará validar el encabezado de origen utilizando la expresión regular, y luego puede hacer eco del valor de origen en el encabezado de respuesta Access-Control-Allow-Origin.
fuente
EDITAR : Use la solución de @ Noyo en lugar de esta. Es más simple, más claro y probablemente mucho más eficiente bajo carga.
¡RESPUESTA ORIGINAL DEJADA AQUÍ SOLO PARA FINES HISTÓRICOS!
Jugué un poco con este problema y se me ocurrió esta solución reutilizable .htaccess (o httpd.conf) que funciona con Apache:
Simplemente configure la
ACCESS_CONTROL_ROOT
variable en la parte superior del bloque para su dominio raíz y se hará eco delOrigin:
valor del encabezado de la solicitud al cliente en elAccess-Control-Allow-Origin:
valor del encabezado de respuesta si coincide con su dominio.Tenga en cuenta también que puede usar
sub.mydomain.com
comoACCESS_CONTROL_ROOT
y limitará los orígenes asub.mydomain.com
y*.sub.mydomain.com
(es decir, no tiene que ser la raíz del dominio). Los elementos que pueden variar (protocolo, puerto) se pueden controlar modificando la porción de coincidencia de URI de la expresión regular.fuente
Estoy respondiendo esta pregunta, porque la respuesta aceptada no puede seguir
Por ejemplo: no enviará encabezados CORS para http://mywebsite.com mientras funcione para http://somedomain.mywebsite.com/
Para habilitar su sitio, simplemente coloque su sitio en lugar de "mywebsite.com" en la Configuración de Apache anterior.
Para permitir múltiples sitios:
Prueba después de la implementación:
La siguiente respuesta curl debe tener el encabezado "Access-Control-Allow-Origin" después del cambio.
fuente
Necesitaba una solución solo para PHP, así que en caso de que alguien también la necesite. Toma una cadena de entrada permitida como "* .example.com" y devuelve el nombre del servidor del encabezado de la solicitud, si la entrada coincide.
Y aquí están los casos de prueba para un proveedor de datos phpunit:
fuente
preg_quote()
porque esa es la forma correcta de hacerlo (aunque.
es el único meta char de regexp válido en un nombre DNS,preg_quote()
describe mejor la operación prevista)none
no es un valor semánticamente válido para el encabezado (o al menos, no hace lo que implica) de acuerdo con la especificación. Como tal,return null;
puede tener más sentido para esa rama, y en ese caso no se debe enviar ningún encabezado al cliente, por lo que el llamador debe verificarlo.preg_quote()
citará el signo * y,str_replace()
por ejemplo, deja un "\" huérfano.Al configurar
Access-Control-Allow-Origin
en .htaccess, solo lo siguiente funcionó:He intentado varias otras palabras clave sugeridas
Header append
,Header set
, ninguno funcionaba como se sugiere en muchas respuestas en SO, aunque no tengo ni idea de si estas palabras clave son obsoletos o no válidos para nginx .Aquí está mi solución completa:
fuente
Tuvimos problemas similares con Font Awesome en un dominio estático "sin cookies" al leer fuentes del "dominio de cookies" (www.domain.tld) y esta publicación fue nuestro héroe. Consulte aquí: ¿Cómo puedo solucionar el problema de fuente web 'Encabezado de respuesta de recursos cruzados faltantes (CORS)'?
Para los tipos de copiar / pegar-r (y para dar algunos accesorios), reconstruí esto de todas las contribuciones y lo agregué a la parte superior del archivo .htaccess de la raíz del sitio:
Súper seguro, súper elegante. Me encanta: no tiene que abrir el ancho de banda de sus servidores a los ladrones de recursos / tipos de enlace activo.
Atrezzo a: @Noyo @DaveRandom @ pratap-koritala
(Traté de dejar esto como un comentario a la respuesta aceptada, pero aún no puedo hacerlo)
fuente
Para Spring Boot encontré esto
RegexCorsConfiguration
que extiende el oficialCorsConfiguration
: https://github.com/looorent/spring-security-jwt/blob/master/src/main/java/be/looorent/security/jwt/RegexCorsConfiguration.javafuente
Parece que la respuesta original fue para pre Apache 2.4. A mi no me sirvió. Esto es lo que tuve que cambiar para que funcione en 2.4. Esto funcionará para cualquier profundidad de subdominio de yourcompany.com .
fuente
Tuve que modificar un poco la respuesta de Lars , como un huérfano
\
terminó en la expresión regular, para comparar solo el host real (sin prestar atención al protocolo o puerto) y quería admitir ellocalhost
dominio además de mi dominio de producción. Por lo tanto, cambié el$allowed
parámetro para ser una matriz.Uso de la siguiente manera:
fuente
en mi caso usando angular
en mi interceptor HTTP, configuré
en el encabezado de la solicitud
fuente