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 finden Sie die my.ini-Konfigurationsdatei in MySQL 5.6 unter Windows

Machen Sie sich eine Notiz, damit Sie später dara...

Detaillierte Einführung in Protokolle im Linux-System

Inhaltsverzeichnis 1. Logbezogene Dienste 2. Geme...

3 Möglichkeiten, die maximale Anzahl von Verbindungen in MySQL richtig zu ändern

Wir alle wissen, dass die standardmäßige MySQL-Da...

Docker stellt MySQL bereit, um Beispielcode für eine Remoteverbindung zu erreichen

1. Docker durchsucht MySQL查看mysql版本 2. Docker Pul...

Detaillierte Analyse der Unterschiede zwischen break und last in Nginx

Lassen Sie uns zunächst über den Unterschied spre...

2017 neueste Version der Windows-Installation MySQL-Tutorial

1. Laden Sie zunächst die neueste Version von MyS...

HTML-Head-Tag-Metadaten zum Erreichen einer Aktualisierungsumleitung

Code kopieren Der Code lautet wie folgt: <html...

Beim Bereitstellen von rabbitmq mit Docker sind zwei Probleme aufgetreten

1. Hintergrund Die folgenden zwei Probleme treten...

Detaillierter Prozess zur Konfiguration von NIS in Centos7

Inhaltsverzeichnis Prinzip Vorbereitung der Netzw...

Auch Webdesigner müssen Web-Coding lernen

Oftmals wird nach der Fertigstellung eines Webdes...

Grundlegende Implementierung der AOP-Programmierung in JavaScript

Einführung in AOP Die Hauptfunktion von AOP (Aspe...

HTML-Kommentare Symbole zum Markieren von Textkommentaren in HTML

HTML-Kommentare: Wir müssen häufig einige HTML-Ko...