Warum sollten Sie mit der add_header-Direktive von Nginx vorsichtig sein?

Warum sollten Sie mit der add_header-Direktive von Nginx vorsichtig sein?

Vorwort

Wie wir alle wissen, legt die Nginx-Konfigurationsdatei den Antwortheader mithilfe der Direktive „add_header“ fest.

Gestern habe ich aus Langeweile mit curl die Informationen einer Site überprüft und festgestellt, dass der zurückgegebene Header nicht meinen Erwartungen entsprach:

HTTP/2 200
Datum: Do, 07. Februar 2019 04:26:38 GMT
Inhaltstyp: Text/HTML; Zeichensatz=UTF-8
variieren: Accept-Encoding, Cookie
Cache-Steuerung: max. Alter=3, muss erneut validiert werden
zuletzt geändert: Do, 07. Feb. 2019 03:54:54 GMT
X-Cache: Fehlschlag
Server: Cloudflare
...

Die Hauptseite konfiguriert HSTS und andere Header in nginx.conf:

add_header Strict-Transport-Security "max-age=63072000; Vorladen";
add_header X-Frame-Optionen SAMEORIGIN;
add_header X-Inhaltstyp-Optionen nosniff;
add_header X-XSS-Schutz "1; Modus=blockieren";

Der Antwortheader verfügt jedoch nicht über diese Header. Zusätzlich zu den regulären Headern ist am Standort nur ein Header-X-Cache konfiguriert.

Der erste Eindruck ist, dass CDN diese Header filtert? Also habe ich nach der Dokumentation von Cloudflare gesucht, aber keine Dokumentation zum Umgang damit gefunden. Wenn man es sich recht überlegt, warum filtert CDN diese? Dir ist langweilig, weil Du zu viel gegessen hast? Sie führen keine politischen Ermittlungen durch!

Das Problem verlagert sich auf die Nginx-Konfiguration. Ich öffnete Google und suchte nach „nginx location add_header“ und fand tatsächlich einige Fehler. Klicken Sie auf das add_header-Dokument der offiziellen Website. Dort finden Sie die folgende Beschreibung (weitere Informationen wurden weggelassen):

Es können mehrere add_header-Direktiven vorhanden sein. Diese Direktiven werden von der vorherigen Ebene übernommen, wenn und nur wenn auf der aktuellen Ebene keine add_header-Direktiven definiert sind.

Beachten Sie die Betonung auf „Diese Anweisungen werden von der vorherigen Ebene übernommen, wenn und nur wenn auf der aktuellen Ebene keine add_header-Anweisungen definiert sind.“ Das heißt, die übergeordneten Einstellungen werden nur übernommen, wenn auf der aktuellen Ebene keine add_header-Direktive vorhanden ist. Meine Frage ist also klar: Am Standort befindet sich „add_header“ und die Konfiguration in nginx.conf wird verworfen.

Dies ist ein beabsichtigtes Verhalten von Nginx und kann nicht als Fehler oder Falle bezeichnet werden. Bei genauerer Betrachtung dieses Satzes fällt jedoch ein interessanteres Phänomen auf: Nur der aktuellste Add_header funktioniert. add_header kann in http, Server und Standort konfiguriert werden, aber die nächstliegende Konfiguration wird wirksam und die obige Konfiguration ist ungültig.

Aber das Problem endet hier nicht. Wird der Standort an einen anderen Standort umgeschrieben, erscheint im Endergebnis nur die zweite Kopfzeile. Zum Beispiel:

Standort /foo1 {
 Header hinzufügen foo1 1;
 //foo2 neu schreiben;
}

Standort /foo2 {
 Füge den Header foo2 1 hinzu.
 Rückgabewert 200 "OK";
}

Unabhängig davon, ob die Anfrage /foo1 oder /foo2 lautet, ist der endgültige Header nur foo2:

Obwohl dies sinnvoll ist und ein normales Verhalten darstellt, fühlt es sich dennoch etwas gezwungen und unangenehm an: Es ist in Ordnung, wenn der Server die HTTP-Konfiguration verliert und der Standort die Serverkonfiguration verliert, aber die beiden Standorte befinden sich auf derselben Ebene!

Wenn Sie die übergeordnete Konfiguration nicht übernehmen können und die Anweisungen im aktuellen Block nicht wiederholen möchten, besteht die Lösung in der Verwendung der Include-Anweisung.

siehe

  • Nginx-Modul ngx_http_headers_module
  • Nginx add_header Konfigurationsfalle
  • Seien Sie sehr vorsichtig mit Ihrem add_header in Nginx! Sie könnten Ihre Site unsicher machen
  • add_header-Direktiven am Standort überschreiben add_header-Direktiven im Server
  • Die Tücke von add_header in der Nginx-Konfiguration

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM.

Das könnte Sie auch interessieren:
  • So fügen Sie Nginx zu den Systemdiensten in CentOS7 hinzu
  • So stellen Sie mit Nginx mehrere Vue-Projekte unter demselben Domänennamen bereit und verwenden einen Reverse-Proxy
  • Python-Implementierungsbeispiel zum Überwachen von Unterschieden in Nginx-Konfigurationsdateien und Senden von E-Mail-Benachrichtigungen
  • Detaillierte Erläuterung der Nginx-Installation, SSL-Konfiguration und allgemeinen Befehle unter Centos7.x
  • So konfigurieren Sie nginx+php+mysql in Docker
  • Lösung für ungültige Nginx-Cross-Domain-Einstellung Access-Control-Allow-Origin
  • Beispielmethode zum Bereitstellen eines React-Projekts auf Nginx
  • Verwenden Sie das Tool nginx.vim zur Syntaxhervorhebung und Formatierung der Konfigurationsdatei nginx.conf
  • Detaillierte Erläuterung der Fallstricke von add_header im Nginx-Konfigurationstutorial
  • Detaillierte Schritte zum Bereitstellen von https-Websites und Konfigurieren der Adressumschreibung in Nginx

<<:  MySQL 5.7.18 Master-Slave-Replikations-Setup (ein Master und ein Slave) Tutorial mit ausführlicher Erklärung

>>:  Detaillierte Erläuterung der Datenübertragung zwischen React-Elternkomponenten und -Kindkomponenten

Artikel empfehlen

So lösen Sie das Zeichensatzproblem bei der Anmeldung bei Linux

Zeichensatzfehler treten immer auf Gebietsschema:...

Lösung für die Willkommensmeldung im Notfallmodus beim Booten von CentOS7.4

Heute habe ich eine virtuelle Maschine für ein Ex...

Reines CSS3 zum Erstellen eines Beispielcodes für Seitenwechseleffekte

Das, was ich vorher geschrieben habe, ist zu komp...

Detaillierte Erklärung der Verwendung des Bash-Befehls

Unter Linux wird Bash als Standard übernommen, wa...

Erfahren Sie in einem Artikel mehr über TypeScript-Datentypen

Inhaltsverzeichnis Grundtypen jeder Typ Arrays Tu...

Detaillierte Erklärung der HTML-Formularelemente (Teil 1)

HTML-Formulare werden verwendet, um verschiedene ...