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:
Überschrift | Anfragen | Domänen | Status |
---|
Datum | 48779277 | 535621 | Protokoll erforderlich |
Inhaltstyp | 47185627 | 533636 | Wird normalerweise vom Browser benötigt |
Server | 43057807 | 519663 | Optional |
Inhaltslänge | 42388435 | 519118 | Nützlich |
zuletzt geändert | 34424562 | 480294 | Nützlich |
Cache-Kontrolle | 36490878 | 412943 | Nützlich |
etag | 23620444 | 412370 | Nützlich |
Inhaltskodierung | 16194121 | 409159 | Erforderlich für komprimierten Inhalt |
läuft ab | 29869228 | 360311 | Optional |
x-powered-by | 4883204 | 211409 | Optional |
Pragma | 7641647 | 188784 | Optional |
X-Frame-Optionen | 3670032 | 105846 | Optional |
Zugriffskontrolle-Herkunft zulassen | 11335681 | 103596 | Nützlich |
x-content-type-options | 11071560 | 94590 | Nützlich |
Link | 1212329 | 87475 | Nützlich |
Alter | 7401415 | 59242 | Nützlich |
X-Cache | 5275343 | 56889 | Optional |
x-xss-schutz | 9773906 | 51810 | Nützlich |
strenge Transportsicherheit | 4259121 | 51283 | Nützlich |
über | 4020117 | 47102 | Optional |
p3p | 8282840 | 44308 | Optional |
Expect-CT | 2685280 | 40465 | Nützlich |
Inhaltssprache | 334081 | 37927 | Umstritten |
x-aspnet-version | 676128 | 33473 | Optional |
Zugangskontrolle-Zulassen-Anmeldeinformationen | 2804382 | 30346 | Nützlich |
x-robots-tag | 179177 | 24911 | Ist für Browser nicht wichtig |
x-ua-kompatibel | 489056 | 24811 | Optional |
Zugriffskontroll-Zulassungsmethoden | 1626129 | 20791 | Nützlich |
Header für Zugriffskontrolle zulassen | 1205735 | 19120 | Nü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.