Generador de cabeceras CORS

Indica los sitios que pueden llamar a tu API, los métodos y cabeceras que usan y si se envían cookies. El generador escribe la lógica de Access-Control-Allow-Origin para uno o varios orígenes, el resto de cabeceras CORS y una respuesta 204 a las peticiones preflight.

Orígenes permitidos
Esquema, host y puerto opcional, separados por comas o espacios: https://app.example.com, http://localhost:3000
Cabeceras que puede enviar el navegador, como Content-Type o Authorization.
Cabeceras de respuesta que JavaScript puede leer además de las básicas, como X-Total-Count. Vacío si no hay.
Cuánto tiempo puede reutilizar el navegador una respuesta preflight. Vacío para omitirla.

nginx: el bloque map va en http {}, el resto en tu server o location. Apache: necesita mod_headers, mod_setenvif y mod_rewrite. Node.js: llama primero a cors(req, res) y detente si devuelve true.

Funciona en tu navegador: nada de lo que escribes se envía a ningún sitio.

Cómo usarlo

  1. Elige el servidor y si permites solo los orígenes indicados o cualquier origen.
  2. Escribe los orígenes tal como los envía el navegador: esquema, host y puerto, sin ruta. La barra final se elimina.
  3. Ajusta métodos, cabeceras de petición, cabeceras expuestas, credenciales y la caché del preflight, y copia la configuración.

Cómo funciona CORS

El navegador añade una cabecera Origin a las peticiones entre sitios. La respuesta debe llevar Access-Control-Allow-Origin con ese origen (o *) o JavaScript no podrá leerla. En las peticiones no simples llega antes un preflight OPTIONS, que hay que responder con los métodos y cabeceras permitidos.

Cabecera Significado
Access-Control-Allow-Origin El único origen que puede leer la respuesta, o *
Access-Control-Allow-Methods Métodos permitidos en la petición real
Access-Control-Allow-Headers Cabeceras que puede enviar el cliente
Access-Control-Expose-Headers Cabeceras de respuesta legibles desde JavaScript
Access-Control-Allow-Credentials true para permitir cookies y autenticación HTTP
Access-Control-Max-Age Segundos que se puede guardar la respuesta preflight

Ejemplo resuelto

Orígenes https://example.com y https://app.example.com para nginx. Como son dos, el generador escribe un map que copia el Origin de la petición en $cors_origin solo si está en la lista:

map $http_origin $cors_origin {
    default "";
    "https://example.com" $http_origin;
    "https://app.example.com" $http_origin;
}

Dentro de location / envía Access-Control-Allow-Origin $cors_origin, Vary: Origin, los métodos, las cabeceras y Access-Control-Max-Age 86400, y responde a OPTIONS con return 204.

Errores frecuentes

  • Una ruta o barra final en el origen. El navegador envía https://example.com, nunca https://example.com/ ni https://example.com/api.
  • Olvidar Vary: Origin cuando el origen permitido cambia según la petición: una CDN podría servir la respuesta de un sitio a otro.
  • Añadir cabeceras CORS en dos sitios (la aplicación y el proxy). Dos cabeceras Access-Control-Allow-Origin hacen que el navegador rechace la respuesta.

Preguntas frecuentes

¿Cómo permito varios orígenes?

Access-Control-Allow-Origin solo admite un origen o *. El servidor debe comparar la cabecera Origin de la petición con su lista y devolver ese origen cuando coincide, junto con Vary: Origin para que las cachés no mezclen respuestas. El map de nginx, la regla SetEnvIf de Apache y la comprobación de Node.js generados hacen justo eso.

¿Por qué no puedo usar * con credenciales?

Lo prohíbe el estándar Fetch: cuando una petición lleva cookies o autenticación HTTP, el navegador solo acepta una respuesta que nombre el origen exacto. Con * y credenciales, el navegador bloquea la respuesta.

¿Qué es una petición preflight?

Para peticiones que no son GET, HEAD o POST de formulario sencillos, por ejemplo con cuerpo JSON o cabecera Authorization, el navegador envía antes un OPTIONS preguntando qué métodos y cabeceras se permiten. El servidor responde con las cabeceras CORS y un 204 vacío; Max-Age permite al navegador guardar esa respuesta.

¿CORS protege mi API?

No. CORS solo indica a los navegadores qué otros sitios pueden leer tus respuestas. Los scripts de servidor y herramientas como curl lo ignoran. La autenticación y los permisos se siguen comprobando en cada petición.

¿Hay que incluir Content-Type en las cabeceras permitidas?

Sí, si los clientes envían JSON. Content-Type solo es libre con text/plain, multipart/form-data o application/x-www-form-urlencoded; application/json provoca un preflight que debe permitirlo.

Más en Desarrollo

Todas las herramientas de la categoría: Desarrollo ·Actualizado el 7 de noviembre de 2026

Opciones de privacidad

Google Analytics nos muestra qué herramientas se usan y si funcionan. Puede usar cookies. Tu elección se guarda en este navegador.