Permitindo solicitações de origem cruzada (CORS) no Nginx para respostas 404

26

Estou usando o Nginx para servir arquivos estáticos em resposta a solicitações do CORS usando a técnica descrita nesta pergunta . No entanto, quando o arquivo não existe, a resposta 404 não contém o Access-Control-Allow-Origin: *cabeçalho e, portanto, é bloqueada pelo navegador.

Como posso enviar Access-Control-Allow-Origin: *respostas 404?

alnorth29
fonte

Respostas:

35

Embora isso tenha sido solicitado há muito tempo, eu estava compilando o nginx com mais módulos, mas com a versão mais recente do nginx, descobri que não precisava compilar o nginx, tudo que eu precisava era adicionar uma alwaysdiretiva.

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

Syntax: add_header name value [always];

Se o parâmetro always for especificado (1.7.5), o campo do cabeçalho será adicionado independentemente do código de resposta.

Portanto, uma versão ajustada dos cabeçalhos 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
fonte
2
alwaysfoi a chave. Obrigado por me indicar isso, eu estava ficando louco!
22816 bgondy
11

Estou assumindo que você está usando a add_headerdiretiva. A documentação observa que isso define apenas o cabeçalho para o código de status 200, 204, 301, 302 e 304. Para definir o cabeçalho para os códigos de status 404, você precisará usar a more_set_headersdiretiva do módulo headers_more (pode ser necessário recompilar o nginx para obter esse módulo). O seguinte definiria o cabeçalho para todos os códigos de status:

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

Você também pode restringi-lo a códigos de status específicos:

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