Configuração para cabeçalhos diferentes para caminhos diferentes, mas sempre acaba servindo o mesmo arquivo

Configuração para cabeçalhos diferentes para caminhos diferentes, mas sempre acaba servindo o mesmo arquivo

Gostaria de servir cabeçalhos diferentes para locais diferentes, mas voltar a servir sempre um arquivo específico (se nenhum arquivo correspondente for encontrado).

Também tenho alguns cabeçalhos globais que precisavam ser adicionados a todas as solicitações, embora com a ressalva de que não os quero adicionados se já tiverem sido adicionados no locationnível.

Eu tenho isso .template.confaté agora:

server {   
   listen   ${PORT};
   # Don't include any local server address info in redirects
   absolute_redirect off;

   index    index.html;

   root ${HTML_SRC};

   include  ${INCLUDE_DIR}/*.conf;
    
   # Serve any matching requested file (CSS, etc.) fallbacking to /index.html
   location / {
      # First try a matching existing file, then just show index.html
      try_files     $uri $uri/ /index.html;
   }
}

O include(in INCLUDE_DIR/headers.conf) é definido como:

# Global headers
add_header  X-FRAME-OPTIONS "DENY"  always;
add_header  Cache-Control   "no-store, must-revalidate" always;
add_header  Report-To   "<global-config>" always;
add_header  Content-Security-Policy "<global-config>" always;

# Location specific paths

# Specific known existing file in /$HTML_SRC/.well-known
location /.well-known/apple-app-site-association$ {
    default_type    application/json;
    # Redirect everything to fallback / location to serve the file
    rewrite .* / last;
}

# Assets
location ~* \.(jpg|jpeg|gif|png|svg|ttf)$ {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Report-To   "<global-config>" always;
    add_header  Content-Security-Policy "<global-config>" always;
    # Cache assets for a bit longer
    add_header  Cache-Control   "max-age=31557600";
    # Redirect everything to fallback / location to serve any files file
    rewrite .* / last;
}

location = /login {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<specific-config>" always;
    add_header  Content-Security-Policy "<specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

# All locations with this prefix have these headers
location /some-other-path {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<other-specific-config>" always;
    add_header  Content-Security-Policy "<other-specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

Eu percebo que qualquer locations com add_headersignifica qualquer nível superior (neste caso, no servermodelo) add_headersnão são herdados.

O problema com o que foi dito acima é que simplesmente não funciona! Os locationcabeçalhos específicos nem sempre são usados. Acho que é rewriteesse o problema, mas também tentei try_files(combinar com o modelo) sem sucesso. Também tentei não ter nada, exceto os cabeçalhos extras no locationbloco, sem sorte. Também acho que o que estou fazendo também não é a melhor abordagem ...

Observe que simplifiquei os cabeçalhos adicionados, os cabeçalhos CSP estão incluídos, por exemplo, existem outros cabeçalhos globais e outros específicos de local. Também tenho outros caminhos que precisam de cabeçalhos diferentes, mas acho que as coisas acima podem ser corrigidas com uma solução genérica que posso aplicar a eles.

Responder1

rewrite...lastfará com que o Nginxprocurar um novo localpara processar a solicitação. Somente o final locationconsegue definir cabeçalhos de resposta.

Você poderia processar a solicitação inteira dentro do mesmo locationbloco que define os cabeçalhos de resposta com rewrite...breakou mais simplesmenteusandotry_filesdo seguinte modo:

try_files /index.html =404;

Observe que o /index.htmltermo énãoúltimo parâmetro. Se fosse o último parâmetro, faria com que o Nginx procurasse um novo local para processar a solicitação.


Como alternativa, mantenha todas as suas add_headerinstruções juntas e use a mappara definir valores específicos. Veresta resposta.

informação relacionada