Permitir solicitudes de origen cruzado (CORS) en Nginx para respuestas 404

26

Estoy usando Nginx para servir archivos estáticos en respuesta a las solicitudes de CORS utilizando la técnica descrita en esta pregunta . Sin embargo, cuando el archivo no existe, la respuesta 404 no contiene el Access-Control-Allow-Origin: *encabezado y el navegador la bloquea.

¿Cómo puedo enviar Access-Control-Allow-Origin: *respuestas 404?

alnorth29
fuente

Respuestas:

35

Aunque esto se preguntó hace mucho tiempo, estaba compilando nginx con más módulos, pero con la versión más nueva de nginx, descubrí que no tenía que compilar nginx a medida, todo lo que necesitaba era agregar una alwaysdirectiva.

http://nginx.org/en/docs/http/ngx_http_headers_module.html

Syntax: add_header name value [always];

Si se especifica el parámetro always (1.7.5), el campo de encabezado se agregará independientemente del código de respuesta.

Entonces, una versión sintonizada de los encabezados CORS :

            if ($cors = "trueget") {
                    # Tells the browser this origin may make cross-origin requests
                    # (Here, we echo the requesting origin, which matched the whitelist.)
                    add_header 'Access-Control-Allow-Origin' "$http_origin" always;

                    # Tells the browser it may show the response, when XmlHttpRequest.withCredentials=true.
                    add_header 'Access-Control-Allow-Credentials' 'true' always;
            }
Arnoldas
fuente
2
alwaysFue la clave. ¡Gracias por señalarme esto, me estaba volviendo loco!
bgondy
11

Supongo que actualmente estás usando la add_headerdirectiva. La documentación señala que esto solo establece el encabezado para el código de estado 200, 204, 301, 302 y 304. Para configurar el encabezado de los códigos de estado 404, deberá usar la more_set_headersdirectiva del módulo headers_more (es posible que deba volver a compilar nginx para obtener este módulo). Lo siguiente establecería el encabezado para todos los códigos de estado:

more_set_headers 'Access-Control-Allow-Origin: *';

También puede restringirlo a códigos de estado específicos:

more_set_headers -s '404' 'Access-Control-Allow-Origin: *';
mgorven
fuente