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 location
nível.
Eu tenho isso .template.conf
até 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 location
s com add_header
significa qualquer nível superior (neste caso, no server
modelo) add_header
snão são herdados.
O problema com o que foi dito acima é que simplesmente não funciona! Os location
cabeçalhos específicos nem sempre são usados. Acho que é rewrite
esse 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 location
bloco, 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...last
fará com que o Nginxprocurar um novo localpara processar a solicitação. Somente o final location
consegue definir cabeçalhos de resposta.
Você poderia processar a solicitação inteira dentro do mesmo location
bloco que define os cabeçalhos de resposta com rewrite...break
ou mais simplesmenteusandotry_files
do seguinte modo:
try_files /index.html =404;
Observe que o /index.html
termo é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_header
instruções juntas e use a map
para definir valores específicos. Veresta resposta.