Me gustaría publicar diferentes encabezados para diferentes ubicaciones, pero recurro a publicar siempre un archivo específico (si no se puede encontrar ningún archivo coincidente).
También tengo algunos encabezados globales que debían agregarse a todas las solicitudes, aunque con la advertencia de que no quiero que se agreguen si ya se agregaron en el location
nivel.
Tengo esto .template.conf
hasta ahora:
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;
}
}
El include
(en INCLUDE_DIR/headers.conf
) se define 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;
}
Me doy cuenta de que cualquier location
s con add_header
significa cualquier nivel superior (en este caso en server
la plantilla) add_header
sno se heredan.
¡El problema con lo anterior es que simplemente no funciona del todo! Los location
encabezados específicos no siempre se utilizan. Creo que ese rewrite
es el problema, pero también lo intenté try_files
(coincidiendo con la plantilla) sin éxito. También intenté no tener nada excepto los encabezados adicionales en el location
bloque sin suerte. También creo que lo que estoy haciendo no es el mejor enfoque...
Tenga en cuenta que he simplificado los encabezados agregados, los encabezados CSP están incluidos, por ejemplo, hay otros encabezados globales y otros específicos de ubicación. También tengo otras rutas que necesitan encabezados diferentes, pero creo que lo que tengo arriba se puede solucionar con una solución genérica que puedo aplicarles.
Respuesta1
rewrite...last
hará que Nginxbuscar una nueva ubicaciónpara procesar la solicitud. Sólo el final location
puede establecer encabezados de respuesta.
Podrías procesar toda la solicitud dentro del mismo location
bloque que establece los encabezados de respuesta con rewrite...break
o más simplementeusandotry_files
como sigue:
try_files /index.html =404;
Observe que el /index.html
término esnoúltimo parámetro. Si fuera el último parámetro, Nginx buscaría una nueva ubicación para procesar la solicitud.
Alternativamente, mantenga todas sus add_header
declaraciones juntas y use a map
para establecer valores específicos. Veresta respuesta.