Konfiguration für verschiedene Header für verschiedene Pfade, aber am Ende wird immer die gleiche Datei bereitgestellt

Konfiguration für verschiedene Header für verschiedene Pfade, aber am Ende wird immer die gleiche Datei bereitgestellt

Ich möchte für unterschiedliche Standorte unterschiedliche Header bereitstellen, aber darauf zurückgreifen, immer eine bestimmte Datei bereitzustellen (wenn keine passende Datei gefunden werden kann).

Ich habe auch einige globale Header, die allen Anfragen hinzugefügt werden müssen, allerdings mit der Einschränkung, dass ich sie nicht hinzufügen möchte, wenn sie auf dieser locationEbene bereits hinzugefügt wurden.

Ich habe .template.confbisher Folgendes:

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;
   }
}

Das include(in INCLUDE_DIR/headers.conf) wird wie folgt definiert:

# 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;
}

Mir ist klar, dass jedes locations mit add_headerjedes s auf oberster Ebene (in diesem Fall in serverder Vorlage) bedeutet add_header.werden nicht vererbt.

Das Problem mit dem oben genannten ist, dass es einfach nicht richtig funktioniert! Die locationspezifischen Header werden nicht immer verwendet. Ich denke, das rewriteist das Problem, aber ich habe es auch versucht try_files(mit dem Vorlagen-Header), ohne Erfolg. Ich habe auch versucht, nichts außer den zusätzlichen Headern im locationBlock zu haben, ohne Erfolg. Ich denke auch, dass das, was ich mache, nicht der beste Ansatz ist ...

Beachten Sie, dass ich die hinzugefügten Header vereinfacht habe. Die CSP-Header sind beispielsweise enthalten, es gibt andere globale Header und andere standortspezifische. Ich habe auch andere Pfade, die andere Header benötigen, aber ich denke, dass die oben genannten Dinge mit einer allgemeinen Lösung behoben werden können, die ich darauf anwenden kann.

Antwort1

rewrite...lastführt dazu, dass NginxSuche nach einem neuen Standortum die Anfrage zu verarbeiten. Nur der Final locationkann Antwortheader festlegen.

Sie können die gesamte Anfrage im selben locationBlock verarbeiten, der die Antwortheader setzt, rewrite...breakoder einfachermittry_fileswie folgt:

try_files /index.html =404;

Beachten Sie, dass der /index.htmlBegriffnichtletzter Parameter. Wenn es der letzte Parameter wäre, würde dies dazu führen, dass Nginx nach einem neuen Ort sucht, um die Anfrage zu verarbeiten.


Alternativ können Sie alle add_headerAnweisungen zusammenhalten und ein verwenden, mapum bestimmte Werte festzulegen. Siehediese Antwort.

verwandte Informationen