Unnötige HTTP-Header

HTTP-Header sind wichtig, um zu steuern, wie der Cache und die Browser Ihre Inhalte verarbeiten. Viele von ihnen werden jedoch falsch oder bedeutungslos verwendet und verbrauchen zusätzliche Ressourcen in einem kritischen Moment des Seitenladens. Möglicherweise funktionieren sie nicht so, wie Sie denken. In einer Reihe von Artikeln über Best Practices werden zunächst unnötige Überschriften behandelt.

Die meisten Entwickler kennen die wichtigen und nützlichen HTTP-Header. Die bekanntesten sind Content-Type und Content-Length , dies sind fast universelle Header. In letzter Zeit wurden jedoch Header wie Content-Security-Policy und Strict-Transport-Security verwendet, um die Sicherheit zu erhöhen, und Link rel=preload , um die Leistung zu verbessern. Trotz der weit verbreiteten Unterstützung in Browsern verwenden nur wenige diese.

Gleichzeitig gibt es viele äußerst beliebte Schlagzeilen, die im Allgemeinen nicht neu und nicht sehr nützlich sind. Wir können dies mithilfe von HTTP Archive beweisen, einem von Google betriebenen und von Fastly gesponserten Projekt, das jeden Monat 500.000 Websites mit WebPageTest herunterlädt und die Ergebnisse auf BigQuery hochlädt.

Hier sind die 30 beliebtesten Antwortheader gemäß HTTP-Archiv (basierend auf der Anzahl der Domänen im Archiv, die in jedem Header angezeigt werden) und eine ungefähre Schätzung des Nutzens der einzelnen:

ÜberschriftAnfragenDomänenStatus
Datum48779277535621Protokoll erforderlich
Inhaltstyp47185627533636Wird normalerweise vom Browser benötigt
Server43057807519663Optional
Inhaltslänge42388435519118Nützlich
zuletzt geändert34424562480294Nützlich
Cache-Kontrolle36490878412943Nützlich
etag23620444412370Nützlich
Inhaltskodierung16194121409159Erforderlich für komprimierten Inhalt
läuft ab29869228360311Optional
x-powered-by4883204211409Optional
Pragma7641647188784Optional
X-Frame-Optionen3670032105846Optional
Zugriffskontrolle-Herkunft zulassen11335681103596Nützlich
x-content-type-options1107156094590Nützlich
Link121232987475Nützlich
Alter740141559242Nützlich
X-Cache527534356889Optional
x-xss-schutz977390651810Nützlich
strenge Transportsicherheit425912151283Nützlich
über402011747102Optional
p3p828284044308Optional
Expect-CT268528040465Nützlich
Inhaltssprache33408137927Umstritten
x-aspnet-version67612833473Optional
Zugangskontrolle-Zulassen-Anmeldeinformationen280438230346Nützlich
x-robots-tag17917724911Ist für Browser nicht wichtig
x-ua-kompatibel48905624811Optional
Zugriffskontroll-Zulassungsmethoden162612920791Nützlich
Header für Zugriffskontrolle zulassen120573519120Nützlich

Schauen wir uns die optionalen Header an, warum wir sie nicht benötigen und was wir dagegen tun können.

Vanity (Server, x-powered-by, via)


Sie können sehr stolz auf Ihre Wahl der Serversoftware sein, aber die meisten Leute kümmern sich nicht darum. Im schlimmsten Fall können diese Header vertrauliche Daten offenlegen, was den Angriff auf Ihre Website erleichtert.

Server: apache
X-Powered-By: PHP/5.1.1
Via: 1.1 varnish, 1.1 squid


Mit RFC7231 können Sie den Server-Header in die Serverantwort aufnehmen und die spezifische Software auf dem Server angeben, die zur Bereitstellung des Inhalts verwendet wird. Meistens ist dies eine Zeichenfolge wie "Apache" oder "Nginx". Obwohl der Titel zulässig ist, ist er optional und für Entwickler oder Endbenutzer nicht besonders wertvoll. Heute ist es jedoch der drittbeliebteste HTTP-Server-Header im Internet.

X-Powered-By ist der beliebteste Titel, der von keinem Standard definiert wird und einen ähnlichen Zweck hat: Er gibt normalerweise die Anwendungsplattform an, auf der der Server ausgeführt wird. Die beliebtesten Antworten sind "ASP.net", "PHP" und "Express". Auch dies bringt keine greifbaren Vorteile und findet nur statt.

Vielleicht kontroverser kann über Via . Es ist erforderlich ( gemäß RFC7230 ), der Anforderung jeden Proxy hinzuzufügen, durch den die Anforderung geleitet wird, um den Proxy zu identifizieren. Dies kann der Proxy-Hostname sein, aber häufiger eine generische Kennung wie "vegur", "lack" oder "squid". Das Entfernen (oder Nicht-Hinzufügen) eines solchen Headers kann zu einem Proxy-Weiterleitungszyklus führen . Es ist jedoch interessant, dass es auch als Antwort auf den Rückweg zum Browser hinzugefügt wird - und hier führt es einfach eine Informationsfunktion aus: Kein Browser macht etwas damit, daher ist es sicher genug, es zu entfernen, wenn Sie möchten.

Veraltete Standards (P3P, läuft ab, X-Frame-Optionen, X-UA-kompatibel)


Eine andere Kategorie von Headern sind solche, die tatsächlich einen Effekt im Browser verursachen, aber (bereits) nicht der beste Weg sind, um diesen Effekt zu erzielen.

P3P: cp="this is not a p3p policy"
Expires: Thu, 01 Dec 1994 16:00:00 GMT
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge


P3P ist eine lustige kleine Sache. Ich hatte keine Ahnung, was es war. Noch lustiger ist, dass einer der häufigsten Inhalte des P3P-Headers "Dies ist keine P3P-Regel" ist. Nun, ist es das oder nicht?

Hier geht die Geschichte auf den Versuch zurück, maschinenlesbare Datenschutzregeln zu standardisieren . Es gab Meinungsverschiedenheiten darüber, wie Daten in Browsern angezeigt werden sollen, und nur ein Browser hat die Unterstützung für diesen Header implementiert - Internet Explorer. Aber selbst darin hatte P3P keinen visuellen Effekt für den Benutzer; Er musste nur anwesend sein, um auf Frames von Drittanbietern in Frames zugreifen zu können. Einige Websites legen sogar P3P-Verstöße fest, wie im obigen Beispiel, obwohl dies höchst fraglich ist .

Es ist unnötig zu erwähnen, dass das Lesen von Cookies von Drittanbietern im Allgemeinen eine schlechte Idee ist. Wenn Sie dies nicht tun, müssen Sie den P3P Header nicht festlegen!

Expires einfach unglaublich beliebt, wenn man bedenkt, dass Cache-Control Expires seit über 20 Jahren überlegen ist. Wenn der Cache-Control Header die max-age Direktive enthält, wird jeder Expires Header in derselben Antwort ignoriert. Eine große Anzahl von Websites setzt jedoch beide Header und Expires am häufigsten am Expires Thu, 01 Dec 1994 16: 00: 00 GMT , damit der Inhalt nicht zwischengespeichert wird. Natürlich ist es am einfachsten, das Datum aus den Spezifikationen zu kopieren.



Aber es besteht einfach keine Notwendigkeit, dies zu tun. Wenn Sie einen Expires Header mit einem Datum aus der Vergangenheit haben, ersetzen Sie ihn einfach durch:

Cache-Control: no-store, private

( no-store ist eine zu strenge Anweisung, um keine Inhalte in einen dauerhaften Speicher zu schreiben. Daher bevorzugen Sie möglicherweise no-cache um eine bessere Leistung zu erzielen, z. B. um in einem Browser vorwärts / rückwärts zu navigieren oder die Ruhe-Tabs fortzusetzen.)

Einige Site-Validierungstools empfehlen Ihnen, einen X-Frame-Options Header mit dem Wert 'SAMEORIGIN' hinzuzufügen. Es teilt den Browsern mit, dass Sie sich weigern, Inhalte an einen Frame auf einer anderen Site zu senden. In der Regel ist dies eine gute Verteidigung gegen Clickjacking . Der gleiche Effekt kann jedoch mit einem anderen Header mit konsistenterer Unterstützung und zuverlässigerem Verhalten erzielt werden:

Content-Security-Policy: frame-ancestors 'self'

Hier gibt es einen zusätzlichen Vorteil, da Sie den CSP-Header aus anderen Gründen noch angeben müssen (dazu später mehr). Wahrscheinlich können Sie in unserer Zeit auf X-Frame-Options .

Schließlich führte Microsoft in IE9 einen "Kompatibilitätsmodus" ein, der die Seite mit der IE8- oder IE7-Engine renderte. Selbst im normalen Modus war der Browser der Ansicht, dass möglicherweise eine ältere Version der Engine für das ordnungsgemäße Rendern erforderlich ist. Diese Heuristiken funktionierten nicht immer korrekt, und Entwickler konnten sie mithilfe des X-UA-Compatible Headers oder Meta-Tags überschreiben. Tatsächlich ist dies ein Standardbestandteil vieler Frameworks wie Bootstrap geworden. Jetzt ist diese Überschrift praktisch nutzlos: Der Anteil der Browser, die sie verstehen, ist sehr gering. Wenn Sie die Site aktiv unterstützen, ist es sehr unwahrscheinlich, dass Technologien verwendet werden, die den Kompatibilitätsmodus starten.

Debuggen von Daten (X-ASPNet-Version, X-Cache)


In mancher Hinsicht ist es überraschend, dass einige der beliebtesten Überschriften in keinem Standard erwähnt werden. Im Wesentlichen bedeutet dies, dass Tausende von Websites irgendwie zugestimmt haben, eine bestimmte Überschrift auf eine bestimmte Weise zu verwenden.

X-Cache: HIT
X-Request-ID: 45a336c7-1bd5-4a06-9647-c5aab6d5facf
X-ASPNet-Version: 3.2.32
X-AMZN-RequestID: 0d6e39e2-4ecb-11e8-9c2d-fa7ae01bbebc


Tatsächlich wurden diese "unbekannten" Überschriften von den Entwicklern nicht erfunden. In der Regel handelt es sich hierbei um Artefakte bei der Verwendung bestimmter Server-Frameworks, Software oder Dienste bestimmter Anbieter (z. B. ist der letzte Header typisch für AWS).

Der X-Cache Header fügt Fastly (und andere CDNs) zusammen mit anderen spezifischen Headern wie X-Cache-Hits und X-Served-By . Wenn das Debuggen aktiviert ist, werden weitere hinzugefügt, z. B. Fastly-Debug-Path und Fastly-Debug-TTL .

Diese Header werden von keinem Browser erkannt und ihre Entfernung wirkt sich überhaupt nicht auf die Anzeige von Seiten aus. Da sie Ihnen, dem Entwickler, nützliche Informationen liefern können, können Sie sie speichern.

Missverständnis (Pragma)


Ich hatte nicht erwartet, dass ich 2018 den Pragma Header erwähnen müsste, aber laut HTTP-Archiv liegt er immer noch an der Spitze (11. Platz). Es wurde nicht nur 1997 für veraltet erklärt, sondern nie als Antwortheader konzipiert, sondern nur als Teil einer Anfrage.

Pragma: no-cache

Trotzdem wird es als Antwortheader so häufig verwendet, dass einige Browser es in diesem Zusammenhang sogar erkennen. Aber heute besteht fast keine Chance, dass jemand Pragma im Kontext der Antwort versteht, aber die Cache-Control nicht versteht. Wenn Sie das Caching deaktivieren möchten, benötigen Sie lediglich die Cache-Control: no-store, private .

Nicht-Browser (X-Robots-Tag)


Eine Überschrift in unseren Top 30 ist keine Überschrift für den Browser. X-Robots-Tag wurde für Crawler wie Google Bots oder Bing entwickelt. Da dies für einen Browser nutzlos ist, können Sie eine solche Antwort nur auf Anforderungen von Crawlern festlegen. Oder Sie entscheiden, dass dies das Testen erschwert oder gegen die Nutzungsbedingungen der Suchmaschine verstößt.

Bugs


Schließlich lohnt es sich, einfache Fehler zu erwähnen. Der Host Header ist in der Anfrage sinnvoll, aber wenn er in der Antwort angezeigt wird, ist Ihr Server wahrscheinlich nicht richtig konfiguriert (und ich würde gerne wissen, wie). 68 Domänen im HTTP-Archiv geben jedoch in ihren Antworten einen Host Header zurück.

Entfernen von Headern auf einem Edge-CDN-Server


Glücklicherweise ist das Entfernen der Header mit VCL ziemlich einfach, wenn Ihre Site bei uns schnell läuft. Wenn Sie das Entwicklungsteam für das Debuggen wirklich nützlich halten möchten, es aber vor der Öffentlichkeit verbergen möchten, können Sie dies problemlos mithilfe von Cookies oder dem eingehenden HTTP-Header tun:

unset resp.http.Server;
unset resp.http.X-Powered-By;
unset resp.http.X-Generator;

if (!req.http.Cookie:debug && !req.http.Debug) {
unset resp.http.X-Amzn-RequestID;
unset resp.http.X-Cache;
}


Im nächsten Artikel werde ich über Best Practices für wirklich benötigte Titel und deren Aktivierung auf dem CDN-Edgeserver sprechen.

Source: https://habr.com/ru/post/de412813/


All Articles