Configuración para diferentes encabezados para diferentes rutas, pero siempre termina sirviendo el mismo archivo

Configuración para diferentes encabezados para diferentes rutas, pero siempre termina sirviendo el mismo archivo

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 locationnivel.

Tengo esto .template.confhasta 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 locations con add_headersignifica cualquier nivel superior (en este caso en serverla plantilla) add_headersno se heredan.

¡El problema con lo anterior es que simplemente no funciona del todo! Los locationencabezados específicos no siempre se utilizan. Creo que ese rewritees 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 locationbloque 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...lasthará que Nginxbuscar una nueva ubicaciónpara procesar la solicitud. Sólo el final locationpuede establecer encabezados de respuesta.

Podrías procesar toda la solicitud dentro del mismo locationbloque que establece los encabezados de respuesta con rewrite...breako más simplementeusandotry_filescomo sigue:

try_files /index.html =404;

Observe que el /index.htmlté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_headerdeclaraciones juntas y use a mappara establecer valores específicos. Veresta respuesta.

información relacionada