¿Hay alguna manera de permitir múltiples dominios cruzados usando el Access-Control-Allow-Origin
encabezado?
Soy consciente de esto *
, pero está demasiado 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 probado el código anterior pero no parece funcionar en Firefox.
¿Es posible especificar múltiples dominios o estoy atascado con solo uno?
.htaccess
http
cors
xmlhttprequest
cross-domain
Thomas J Bradley
fuente
fuente
Access-Control-Allow-Origin
encabezado no significa que otros dominios no puedan activar un método en este punto final (por ejemplo, método REST API). Simplemente significa que los orígenes no permitidos no pueden usar el resultado en javascript (el navegador lo asegura). Para restringir el acceso a un punto final para dominios específicos, utilice un filtro de solicitud del lado del servidor que, por ejemplo, devuelva HTTP 401 para dominios no permitidos.Vary: Origin
encabezado cuando desee utilizar varias URL, consulte: fetch.spec.whatwg.org/#cors-protocol-and-http-cachesRespuestas:
Parece que la forma recomendada de hacerlo es hacer que su servidor lea el encabezado Origin del cliente, compare eso con la lista de dominios que le gustaría permitir, y si coincide, repita el valor del
Origin
encabezado de nuevo al cliente como elAccess-Control-Allow-Origin
encabezado en la respuesta.Con
.htaccess
usted puede hacerlo así:fuente
Otra solución que estoy usando en PHP:
fuente
header('Access-Control-Allow-Origin: *')
veces dice que no se puede usar comodín si el indicador de credenciales es verdadero, sucede cuandoheader('Access-Control-Allow-Credentials: true')
probablemente. Por lo tanto, es mejor Permitir-Origen en$http_origin
sí mismo si se cumplen las condicionesheader("Access-Control-Allow-Origin: " . $http_origin);
para que funcioneEsto funcionó para mí:
Cuando se coloca
.htaccess
, funcionará seguro.fuente
Header set Access-Control-Allow-Credentials true
para que esto funcionara como la respuesta de @GeorgeReferer
lugar deOrigin
. UsandoReferer
trabajos pero el problema es que restablece la URL completa aAccess-Control-Allow-Origin
Quiero cortar el nombre de dominioReferer
y asignarloAccess-Control-Allow-Origin
. Algo así como el resultado de esto -echo http://example.com/index.php/ab/cd | cut -d'/' -f1,2,3
en el comando bash. ¿Es posible hacer lo mismo en el archivo de configuración (apache)? ¿Alguna idea?Tuve el mismo problema con woff-fonts, varios subdominios tenían que tener acceso. Para permitir subdominios, agregué algo como esto a mi httpd.conf:
Para múltiples dominios, simplemente puede cambiar la expresión regular en
SetEnvIf
.fuente
(.*\.?example\.org)
paraexample.com
ysub.example.com
.subexample.com
. Debe cambiarlo a:((.*\.)?example\.org)
Aquí le mostramos cómo hacer eco del encabezado Origin si coincide con su dominio con Nginx, esto es útil si desea servir una fuente en varios subdominios:
fuente
.
interpreta in example.org como cualquier valor ya que esta es una expresión regular? En ese caso, ¿permitiría esto por error un TLD de ejemplo-organización personalizado?"^example\.org$"
que debe asegurarse de que un hacker no pueda deslizarse a través de su expresión regular consubdomainexample.org
(use^
) oexample.orgevil
(use$
) oexamplezorg
(escape\.
)Esto es lo que hice para una aplicación PHP que AJAX solicita
Si mi servidor permite el origen de la solicitud, devuélvala
$http_origin
como valor delAccess-Control-Allow-Origin
encabezado en lugar de devolver un*
comodín.fuente
Hay una desventaja que debe tener en cuenta: tan pronto como externalice los archivos a un CDN (o cualquier otro servidor que no permita secuencias de comandos) o si sus archivos se almacenan en caché en un proxy, alterando la respuesta basada en 'Origin' el encabezado de solicitud no funcionará.
fuente
Vary: Origin
no es compatible con Akamai , uno de los mayores CDN que existen ... Más detalles disponibles aquí tambiénPara dominios múltiples, en su
.htaccess
:fuente
Header set Vary Origin
sería una buena adición a esta respuesta.AccessControlAllowOrigin=$0$1
aAccessControlAllowOrigin=$0
. De lo contrario, no funcionó para los orígenes HTTPS.http://example.com
salió correctamente, perohttps://example.com
salió comohttps://example.coms
, con un extras
en el final.Para usuarios de Nginx permitir CORS para múltiples dominios. Me gusta el ejemplo de @ marshall, aunque sus respuestas solo coinciden con un dominio. Para hacer coincidir una lista de dominio y subdominio, esta expresión regular facilita el trabajo con fuentes:
Esto solo hará eco de los encabezados "Access-Control-Allow-Origin" que coinciden con la lista de dominios dada.
fuente
Para IIS 7.5+ con el módulo URL Rewrite 2.0 instalado, vea esta respuesta SO
fuente
Aquí hay una solución para la aplicación web Java, basada en la respuesta de yesthatguy.
Estoy usando Jersey REST 1.x
Configure web.xml para conocer Jersey REST y CORSResponseFilter
Aquí está el código para CORSResponseFilter
fuente
Como se mencionó anteriormente,
Access-Control-Allow-Origin
debe ser único yVary
debe establecerseOrigin
si está detrás de una CDN (Content Delivery Network).Parte relevante de mi configuración de Nginx:
fuente
set $cors
algún tipo de significado oculto, o es solo específico para su conífera? parece que se puede omitir junto con el segundoif
Tal vez estoy equivocado, pero hasta donde puedo ver
Access-Control-Allow-Origin
tiene un"origin-list"
parámetro como.Por definición, un
origin-list
es:Y a partir de esto, sostengo que se admiten diferentes orígenes y deben estar separados por espacios .
fuente
5.1 Access-Control-Allow-Origin Response Header
establece que la lista de origen está restringida: en lugar de permitir una lista de orígenes separados por espacios, es un origen único o la cadena "nulo".Para las aplicaciones ExpressJS puede usar:
fuente
Me costó configurar esto para un dominio que ejecuta HTTPS, así que pensé que compartiría la solución. Usé la siguiente directiva en mi archivo httpd.conf :
Cambia
example.com
a tu nombre de dominio. Agregue esto dentro<VirtualHost x.x.x.x:xx>
de su archivo httpd.conf . Tenga en cuenta que siVirtualHost
tiene un sufijo de puerto (por ejemplo:80
), esta directiva no se aplicará a HTTPS, por lo que también deberá ir a / etc / apache2 / sites-available / default-ssl y agregar la misma directiva en ese archivo, dentro de la<VirtualHost _default_:443>
sección.Una vez que se actualizan los archivos de configuración, deberá ejecutar los siguientes comandos en el terminal:
fuente
^http(s)?://(.+\.)?example\.com(:\d+)?$
Si tiene problemas con las fuentes, use:
fuente
Un enfoque más flexible es usar las expresiones de Apache 2.4. Puede hacer coincidir dominios, rutas y casi cualquier otra variable de solicitud. Aunque la respuesta enviada siempre es
*
, los únicos solicitantes que la reciben son los que cumplen los requisitos de todos modos. El uso delOrigin
encabezado de solicitud (o cualquier otro) en la expresión hace que Apache lo combine automáticamente en elVary
encabezado de respuesta, por lo que esa respuesta no se reutilizará para un origen diferente.fuente
*
credenciales como Iniciar sesión. Por lo tanto, será mejor si pasa el nombre de host coincidente en lugar de*
.Access-Control-Allow-Origin
encabezado de laOPTIONS
solicitud de verificación previa que verifica los encabezados para ver si el servidor permite este origen. Lo tengo arreglado. Así que*
no fue el verdadero problema para mí. Pero, aún algunos navegadores no aceptan*
credenciales, por lo que cuando una aplicación web envía una solicitud de origen cruzado, DEBEN especificar unHTTP_ORIGIN
encabezado al que pueda acceder dinámicamente con la variableOrigin
en.htaccess
Apache o$_SERVER['HTTP_ORIGIN'];
en PHP. De todos modos, su solución es buena, ya que permite todos los orígenes, pero menos segura*
permite todo. 2) HOST es diferente de ORIGEN. HOST es el "HOST OBJETIVO" real que se pasa al encabezado de solicitud. Pero ORIGIN es elINITIAL HOST
que envía la solicitud alTARGET HOST
. Por lo tanto, en su código,ORIGIN HOST
se ignora y nunca se usa. Vea las respuestas anteriores y verá cómo usan losORIGIN
valores para agregarlosAccess-Control-Allow-Origin
.*
No permite a todos porque usar elOrigin
encabezado de solicitud en la expresión hace que Apache lo combine automáticamente en elVary
encabezado de respuesta, a menos que se usereq_novary('Origin')
(probablemente no deseable). Los navegadores saben que pueden obtener una respuesta diferente para una diferenteOrigin
y si el valor enviado no pasa la prueba, elAccess-Control-Allow-Origin
encabezado nunca se establece.Código PHP:
fuente
HTTP_ORIGIN no es utilizado por todos los navegadores. ¿Qué tan seguro es HTTP_ORIGIN? Para mí viene vacío en FF.
Tengo los sitios a los que autorizo el acceso a mi sitio y los envío a través de una ID de sitio, luego verifico mi base de datos para el registro con esa identificación y obtengo el valor de la columna SITE_URL (www.yoursite.com).
Incluso si envía un ID de sitio válido, la solicitud debe ser del dominio que figura en mi base de datos asociada con ese ID de sitio.
fuente
Aquí hay una opción ampliada para Apache que incluye algunas de las definiciones de fuente más recientes y planificadas:
fuente
Para facilitar el acceso a múltiples dominios para un servicio ASMX, creé esta función en el archivo global.asax:
Esto permite el manejo CORS del
OPTIONS
verbo también.fuente
Ejemplo de código PHP para subdominios coincidentes.
fuente
Para una copia / pegado bastante fácil para aplicaciones .NET, escribí esto para habilitar CORS desde un
global.asax
archivo. Este código sigue los consejos dados en la respuesta actualmente aceptada, reflejando cualquier origen devuelto en la solicitud en la respuesta. Esto efectivamente logra '*' sin usarlo.La razón de esto es que habilita varias otras funciones de CORS , incluida la capacidad de enviar una AJAX XMLHttpRequest con el atributo 'withCredentials' establecido en 'verdadero'.
fuente
Y una respuesta más en Django. Para tener una vista única que permita CORS desde múltiples dominios, aquí está mi código:
fuente
AWS Lambda / API Gateway
Para obtener información sobre cómo configurar múltiples orígenes en AWS Lambda y API Gateway sin servidor, aunque una solución bastante grande para algo que uno sentiría debería ser bastante sencillo, consulte aquí:
https://stackoverflow.com/a/41708323/1624933
Actualmente no es posible configurar múltiples orígenes en API Gateway, consulte aquí: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors-console.html ), pero la recomendación (en la respuesta anterior) es:
Obviamente, la solución simple es habilitar ALL (*) así:
Pero podría ser mejor hacer esto en el lado de API Gateway (ver el segundo enlace más arriba).
fuente
Access-Control-Allow-Credentials: true
no está permitido con comodinesAccess-Control-Allow-Origin: *
. Establecer un específico en su<origin>
lugar.La respuesta de soporte de Google sobre la publicación de anuncios a través de SSL y la gramática en el RFC en sí parece indicar que puede delimitar el espacio de las URL. No estoy seguro de qué tan bien soportado está en diferentes navegadores.
fuente
origin-list
: tools.ietf.org/html/rfc6454#section-7.1Si prueba tantos ejemplos de código como yo para que funcione con CORS, vale la pena mencionar que primero debe borrar su caché para probar si realmente funciona, similar a problemas como cuando las imágenes antiguas todavía están presentes, incluso si es eliminado en el servidor (porque todavía está guardado en su caché).
Por ejemplo CTRL + SHIFT + DEL en Google Chrome para eliminar su caché.
Esto me ayudó a usar este código después de probar muchas
.htaccess
soluciones puras y esta parecía ser la única que funcionaba (al menos para mí):También tenga en cuenta que está muy extendido que muchas soluciones dicen que tiene que escribir,
Header set ...
pero es asíHeader add ...
. Espero que esto ayude a alguien que tiene los mismos problemas durante algunas horas como yo.fuente
La siguiente respuesta es específica de C #, pero el concepto debería ser aplicable a todas las plataformas diferentes.
Para permitir solicitudes de origen cruzado desde una API web, debe permitir las solicitudes de opción a su aplicación y agregar la anotación a continuación en el nivel del controlador.
[EnableCors (UrlString, Header, Method)] Ahora los orígenes se pueden pasar solo como una cadena. Entonces, si desea pasar más de una URL en la solicitud, páselo como un valor separado por comas.
UrlString = " https: //a.hello.com,https: //b.hello.com "
fuente
Solo se puede especificar un origen único para el encabezado Access-Control-Allow-Origin. Pero puede establecer el origen en su respuesta de acuerdo con la solicitud. Además, no olvide configurar el encabezado Vary. En PHP haría lo siguiente:
fuente
También podemos configurar esto en el archivo Global.asax para la aplicación Asp.net.
fuente