Los navegadores pueden bloquear las solicitudes de origen cruzado hacia Object Storage Service (OSS) debido a la política del mismo origen. Esta política restringe el acceso al mismo protocolo, dominio y puerto. Por ejemplo, una página en https://www.example.com https://example-bucket.oss-cn-hangzhou.aliyuncs.com/test.jpg.
Configure reglas de CORS para su bucket con el fin de autorizar a sitios web específicos a acceder directamente a los recursos de OSS.
Cómo funciona
Las solicitudes CORS se dividen en dos tipos: solicitudes simples, que se envían directamente, y solicitudes preflight, que requieren una verificación de autorización antes de la solicitud principal.
Se requiere una solicitud preflight si se cumple alguna de a continuación condiciones:
La solicitud utiliza un método distinto de
GET,HEADoPOST.La solicitud usa el método
POSTcon un encabezadoContent-Typediferente detext/plain,application/x-www-form-urlencodedomultipart/form-data.La solicitud incluye encabezados personalizados, como
x-oss-*.
Cuando un navegador envía una solicitud simple a OSS, ocurre el siguiente proceso:
El navegador agrega el encabezado
Origina la solicitud. Este encabezado especifica el origen de la página que realiza la llamada; por ejemplo,Origin: https://www.example.com.OSS compara el método HTTP y el encabezado
Originde la solicitud con las reglas de CORS del bucket para encontrar una coincidencia. Si encuentra una, incluye el encabezadoAccess-Control-Allow-Originen la respuesta. El valor de este encabezado corresponde al valor del encabezadoOriginde la solicitud inicial.El navegador recibe la respuesta. Permite que la solicitud continúe solo si el encabezado
Access-Control-Allow-Originestá presente y su valor coincide con el dominio de la página. De lo contrario, la solicitud falla.
Una solicitud preflight añade estos pasos antes del flujo de la solicitud simple. Si tiene éxito, continúa con el mismo proceso que una solicitud simple:
El navegador envía una solicitud
OPTIONSque incluye el método (Access-Control-Request-Method) y los encabezados (Access-Control-Request-Headers) de la solicitud principal prevista.OSS comprueba si el método y los encabezados de la solicitud están permitidos según la configuración de CORS. Si la solicitud preflight incluye algún método o encabezado no permitido por las reglas, la solicitud falla y no se envía la solicitud principal.
Cargar recursos de un sitio web estático
Un sitio web en https://www.example.com necesita cargar imágenes, CSS y archivos JS almacenados en un bucket de OSS.
Paso 1: Configurar una regla de CORS
Inicie sesión en la consola de OSS. Vaya a la página Content Security > CORS del bucket de destino y cree una regla de la siguiente manera:
|
Parámetro |
Valor |
Descripción |
|
Origin |
|
Restringe el acceso a este sitio web. |
|
Allowed Methods |
|
|
|
Allowed Headers |
Vacío |
No es obligatorio, ya que las solicitudes simples no activan una solicitud preflight. |
|
Exposed Headers |
|
|
|
Cached Timeout (Seconds) |
86400 |
Almacena en caché los resultados de las solicitudes preflight durante 24 horas. |
|
Vary: Origin |
Sin seleccionar |
No es necesario cuando se usa un único origen específico. |
Paso 2: Comprobar la configuración
Visite https://www.example.com y confirme que los recursos de OSS, como las imágenes, se cargan correctamente y que no hay errores de CORS en la consola del navegador.
Cargar archivos directamente desde el frontend
Un usuario en la página web https://app.example.com carga archivos, como avatares y documentos, directamente en OSS.
Paso 1: Configurar una regla de CORS
Inicie sesión en la consola de OSS. Vaya a la página Content Security > CORS del bucket de destino y cree una regla de la siguiente manera:
|
Parámetro |
Valor |
Descripción |
|
Origin |
|
Restringe las cargas a esta aplicación autorizada. |
|
Allowed Methods |
|
|
|
Allowed Headers |
|
Por seguridad, las cargas directas usan firmas temporales (URL prefirmadas) en lugar de un encabezado |
|
Exposed Headers |
|
|
|
Cached Timeout (Seconds) |
600 |
Una caché de 10 minutos equilibra la reducción de solicitudes preflight con actualizaciones rápidas de la configuración. |
|
Vary: Origin |
Seleccionado |
Evita la contaminación de la caché de CDN en posibles despliegues multidominio. |
Paso 2: Comprobar la configuración
Ejecute una operación de carga en la página https://app.example.com y confirme que el archivo se cargó correctamente en OSS y que no hay errores de CORS en la consola del navegador.
Compatibilidad con varios entornos
Varios subdominios de desarrollo, pruebas y producción, como dev.example.com y app.example.com, necesitan acceder a los mismos recursos de OSS.
Paso 1: Configurar una regla de CORS
Inicie sesión en la consola de OSS. Vaya a la página Content Security > CORS del bucket de destino y cree una regla de la siguiente manera:
|
Parámetro |
Valor |
Descripción |
|
Origin |
|
El comodín |
|
Allowed Methods |
|
Admite lectura y carga en todos los entornos. |
|
Allowed Headers |
|
El comodín |
|
Exposed Headers |
|
Admite tanto la validación de descargas como la retroalimentación de los resultados de carga. |
|
Cached Timeout (Seconds) |
3600 |
Una caché de 1 hora equilibra el rendimiento con la flexibilidad para depurar. |
|
Vary: Origin |
Seleccionado |
Obligatorio. Indica a CDN que almacene en caché las respuestas por |
Paso 2: Comprobar la configuración
Ejecute pruebas de acceso o de carga tanto en https://dev.example.com como en https://app.example.com para confirmar que todas las operaciones se completan correctamente.
Hacer llamadas estilo API con autenticación
Una aplicación de frontend en https://api.example.com necesita acceder a recursos protegidos de OSS e incluir encabezados personalizados como Authorization.
Paso 1: Configurar una regla de CORS
Inicie sesión en la consola de OSS. En el bucket de destino, vaya a la página Content Security > CORS y cree una regla de la siguiente manera:
|
Parámetro |
Valor |
Descripción |
|
Origin |
|
Para solicitudes con información de autenticación, el origen debe ser un dominio preciso y de confianza. |
|
Allowed Methods |
|
Admite la lectura, actualización y eliminación de recursos privados. |
|
Allowed Headers |
|
No utilice |
|
Exposed Headers |
|
Proporciona un identificador de verificación para operaciones correctas y un ID para solucionar problemas. |
|
Cached Timeout (Seconds) |
600 |
Una caché más corta (10 minutos) garantiza que los cambios en la política de seguridad se apliquen rápidamente. |
|
Vary: Origin |
Seleccione |
Garantiza que CDN almacene en caché las respuestas por separado para cada origen. |
Paso 2: Comprobar la configuración
Inicie una solicitud con un encabezado Authorization desde la página https://api.example.com y confirme que puede acceder al recurso protegido de OSS.
Aplicar en producción
Prácticas recomendadas de seguridad
Siga el principio de mínimo privilegio.
Configure Origin (AllowedOrigin) con precisión: evite establecer
*enSourcesa menos que su bucket sea completamente público. Especifique dominios exactos, comohttps://www.example.com.Restrinja Allowed Methods: exponga únicamente los métodos HTTP que su aplicación necesite. Para sitios de solo lectura, configure solo
GETyHEAD.Especifique Allowed Headers de forma explícita: para solicitudes autenticadas (con el encabezado
Authorization), no utilice*. Enumere explícitamente todos los encabezados de solicitud obligatorios.
Prácticas recomendadas de rendimiento
Optimice la caché de solicitudes preflight: un valor razonable de
MaxAgeSeconds, como86400segundos (24 horas), reduce significativamente las solicitudes preflight, lo que disminuye la latencia y el costo.Evalúe el impacto de
Vary: Origin: habilitarVary: Originresuelve problemas de envenenamiento de caché, pero aumenta la complejidad del almacenamiento en caché de CDN. Esto puede reducir la tasa de aciertos de la caché e incrementar el tráfico de retorno al origen (costo y latencia adicionales). Habilítelo solo después de evaluar sus patrones de tráfico.
Aceleración con CDN
Si su bucket se acelera mediante Alibaba Cloud CDN y se accede a él a través de un dominio de CDN, las solicitudes de origen cruzado llegarán primero a un punto de presencia (PoP) de CDN. Debe configurar las reglas de CORS en la consola de CDN, no en la consola de OSS. La configuración de CORS en OSS solo aplica a las solicitudes enviadas directamente al dominio de origen de OSS. Para obtener más detalles, consulte Configure cross-origin resource sharing.
Parámetros de las reglas de CORS
Puede configurar hasta 20 reglas de CORS para cada bucket. OSS evalúa las reglas secuencialmente de arriba hacia abajo y aplica la primera que coincida con la solicitud. Una vez que encuentra una coincidencia, no revisa las reglas siguientes.
|
Parámetro |
Obligatorio |
Descripción |
|
Origin (AllowedOrigin) |
Sí |
Especifica los sitios web (dominios de origen) que tienen permiso para enviar solicitudes de origen cruzado a los recursos de OSS.
|
|
Allowed Methods (AllowedMethod) |
Sí |
Especifica los métodos HTTP permitidos.
|
|
Allowed Headers (AllowedHeader) |
No |
Aplica a las solicitudes preflight y determina qué encabezados HTTP se pueden incluir en la solicitud real.
|
|
Exposed Headers (ExposeHeader) |
No |
Especifica qué encabezados de respuesta de OSS son accesibles para JavaScript del lado del cliente.
|
|
Cached Timeout (MaxAgeSeconds) |
No |
Especifica el tiempo en segundos durante el cual un navegador puede almacenar en caché el resultado de una solicitud preflight
|
|
Vary: Origin |
No |
Determina si se agrega el encabezado de respuesta HTTP
Importante
Habilitar esta opción puede disminuir la tasa de aciertos de la caché de CDN. |
Preguntas frecuentes
Error: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Este error suele indicar que el navegador almacenó en caché una respuesta antigua sin encabezados CORS, o que ninguna regla de CORS coincide con la solicitud entrante.
Borre la caché de su navegador y vuelva a probar. Si el error persiste, compruebe sus reglas de CORS:
Inicie sesión en la consola de OSS.
Haga clic en Buckets y luego haga clic en el nombre del bucket de destino.
En el panel de navegación izquierdo, elija Content Security > CORS.
En la página CORS, haga clic en Create Rule.
En el panel Create CORS Rule, establezca Origin en
*, seleccione todos los Allowed Methods, establezca Allowed Headers en*, establezca Exposed Headers enETagyx-oss-request-id, establezca Cache Timeout (Seconds) en 0, seleccione Vary: Origin y haga clic en OK.-
Si el problema persiste, inicie sesión en cualquier servidor y ejecute el siguiente comando para consultar los encabezados de la solicitud de origen cruzado.
curl -v -o output_file.txt -H 'Origin:[$URL2]' '[$URL1]'Nota[URL1] es la URL del recurso de OSS solicitado.
[URL2] es la dirección de origen que configuró en la regla de CORS.
El sistema muestra un resultado similar al siguiente.

-
Si la respuesta incluye un encabezado CORS coincidente, es probable que el problema se deba a la caché del navegador o de la red. Una solicitud anterior sin CORS pudo haberse almacenado localmente, y una solicitud de origen cruzado posterior recuperó esa respuesta en caché en lugar de obtener una nueva del servidor. Pruebe las siguientes soluciones:
Presione Ctrl+F5 en su navegador para borrar la caché y luego compruebe si el problema persiste.
-
Establezca Cached-Seconds en 0 en la regla de CORS. Esto obliga a que cada solicitud vuelva a obtener la autorización CORS del servidor.
NotaPuede establecer el
cache-controlde un objeto enno-cachecuando lo cargue. Para los objetos que ya se cargaron, puede usar ossutil para cambiar esta configuración. Para obtener más información, consulte set-meta (Manage object metadata). Utilice CDN para acelerar OSS y asegúrese de que todas las solicitudes servidas por CDN incluyan encabezados CORS.
-
Si la respuesta contiene dos encabezados CORS o un encabezado que no coincide con su configuración de OSS, es probable que el problema se deba al uso de CDN para acelerar OSS:
Inicie sesión en la consola de CDN y deshabilite temporalmente la aceleración de CDN para el nombre de dominio con el fin de confirmar que el problema de origen cruzado se resolvió.
Después de confirmarlo, haga clic en el nombre de dominio específico y luego vaya a Cache Configuration > Node HTTP Response Header.
Establezca los encabezados de respuesta HTTP personalizados según sea necesario.
Si el problema de CORS aún no se resuelve, consulte Common errors and solutions for OSS CORS para continuar con la solución de problemas.
Error: The 'Access-Control-Allow-Origin' header has a value '...' that is not equal to the supplied origin.
El servidor devolvió un encabezado Access-Control-Allow-Origin, pero su valor no coincide con el Origin de la solicitud. A menudo se trata de un problema de caché: un navegador o CDN almacena la respuesta para un dominio y la sirve a otro.
Habilite la opción Vary: Origin en su regla de CORS para evitar conflictos de caché entre distintos sitios web, o borre la caché de su navegador antes de volver a intentarlo.
Error: Response to preflight request doesn't pass access control check: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
Este error ocurre porque el frontend envió una solicitud con credenciales (Access-Control-Allow-Credentials es True), pero Access-Control-Allow-Origin está establecido en *. Los navegadores prohíben esta combinación para evitar que cualquier sitio acceda a datos confidenciales, como cookies o tokens de Authorization.
Si necesita credenciales, cambie
Sourcesde*a un dominio específico (por ejemplo,https://example.com).Si no necesita credenciales, establezca
xhr.withCredentialsenfalseen su código de frontend y asegúrese de queAccess-Control-Allow-Credentialsseafalseen el servidor.
¿Cómo mejorar la carga lenta de origen cruzado desde OSS?
La velocidad de carga de origen cruzado depende de la latencia de red entre el cliente y el bucket de OSS. Una solicitud de origen cruzado incluye un encabezado Origin. Para accesos de larga distancia (por ejemplo, de China (Hong Kong) a China continental), utilice un endpoint de Transfer Acceleration para optimizar la ruta de red.
Transfer Acceleration optimiza las rutas de red para mejorar las velocidades de transferencia de datos a nivel global.