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 location
Ebene bereits hinzugefügt wurden.
Ich habe .template.conf
bisher 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 location
s mit add_header
jedes s auf oberster Ebene (in diesem Fall in server
der Vorlage) bedeutet add_header
.werden nicht vererbt.
Das Problem mit dem oben genannten ist, dass es einfach nicht richtig funktioniert! Die location
spezifischen Header werden nicht immer verwendet. Ich denke, das rewrite
ist 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 location
Block 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...last
führt dazu, dass NginxSuche nach einem neuen Standortum die Anfrage zu verarbeiten. Nur der Final location
kann Antwortheader festlegen.
Sie können die gesamte Anfrage im selben location
Block verarbeiten, der die Antwortheader setzt, rewrite...break
oder einfachermittry_files
wie folgt:
try_files /index.html =404;
Beachten Sie, dass der /index.html
Begriffnichtletzter 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_header
Anweisungen zusammenhalten und ein verwenden, map
um bestimmte Werte festzulegen. Siehediese Antwort.