Optimale HTTP-Header für bessere Performance und Sicherheit
Autor: Ronny Zimmermann
Einführung
Die richtigen HTTP-Header sind entscheidend für die Performance, Sicherheit und Cache-Optimierung deiner Website. Sie bestimmen, wie lange Inhalte im Browser zwischengespeichert werden, welche Sicherheitsrichtlinien greifen und wie externe Anfragen behandelt werden. In diesem Beitrag erfährst du, welche Header besonders wichtig sind und wie du sie in HugoCMS, Nginx oder Apache korrekt konfigurierst.
Wichtige HTTP-Header für Performance und Sicherheit
Date
Dieser Header zeigt das Datum und die Uhrzeit des Servers, zu der die Antwort gesendet wurde.
Date: Wed, 12 Feb 2025 18:40:41 GMT
Tipp: Dieser Header wird automatisch vom Server gesetzt und muss nicht manuell geändert werden.
Server
Dieser Header gibt an, welche Software der Server verwendet.
Server: Apache
Tipp: Vermeide die Anzeige dieses Headers aus Sicherheitsgründen. In Apache kannst du ihn deaktivieren mit:
ServerTokens Prod
Strict-Transport-Security (HSTS)
Dieser Header zwingt den Browser, nur über HTTPS auf die Seite zuzugreifen.
Strict-Transport-Security: max-age=31536000; includeSubDomains
Empfohlen für alle Websites! Setze diesen Header in Nginx oder Apache:
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Frame-Options
Schützt deine Seite vor Clickjacking-Angriffen.
X-Frame-Options: DENY
Tipp: Verwende DENY
, um die Einbettung in iFrames zu verhindern.
X-Content-Type-Options
Verhindert MIME-Type-Sniffing und schützt vor Content Injection-Angriffen.
X-Content-Type-Options: nosniff
Tipp: Setze diesen Header, um sicherzustellen, dass der Browser Dateien nur mit dem richtigen MIME-Typ verarbeitet.
Referrer-Policy
Steuert, welche Referrer-Informationen an andere Websites gesendet werden.
Referrer-Policy: strict-origin-when-cross-origin
Tipp: Diese Einstellung bietet ein gutes Gleichgewicht zwischen Sicherheit und Funktionalität.
Age
Zeigt an, wie lange eine zwischengespeicherte Ressource bereits im Cache liegt.
Age: 5115
Tipp: Falls Age: 0
oder Nicht vorhanden
ist, könnte dein Server kein Caching verwenden.
Cache-Control
Definiert, wie lange Inhalte zwischengespeichert werden.
Cache-Control: no-cache, private
Optimierung:
- Für statische Inhalte:
public, max-age=31536000, immutable
- Für dynamische Inhalte:
private, no-cache, must-revalidate
Apache-Konfiguration:
Header set Cache-Control "public, max-age=31536000, immutable"
Nginx-Konfiguration:
location /static/ {
expires 1y;
add_header Cache-Control "public, max-age=31536000, immutable";
}
HTTP-Header in HugoCMS setzen
Hugo selbst kann keine HTTP-Header setzen, da es nur statische Dateien generiert. Je nach Serverumgebung musst du die Header an der richtigen Stelle konfigurieren:
Falls dein Hosting Apache nutzt, kannst du eine .htaccess
Datei in static/
ablegen:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "DENY"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Cache-Control "public, max-age=31536000, immutable"
</IfModule>
Falls du Nginx nutzt, bearbeite deine nginx.conf
, um die Header global zu setzen.
Falls du ein CDN (Cloudflare, Fastly) verwendest, kannst du die Header direkt dort definieren.
Das Script zur Überprüfung der HTTP-Header
Mit diesem Python-Skript kannst du die HTTP-Header einer Webseite überprüfen und deren Ping-Zeit messen.
Installation und Ausführung
Speichere das Skript als check_headers.py
und führe es mit:
python3 check_headers.py
Python-Skript:
import requests
import subprocess
import re
from datetime import datetime
# Liste der zu testenden Webseiten
URLS = [
"https://autoprofis24.de",
"https://flexrohr24.de",
"https://hugocms.com"
]
def get_ping(url):
"""Führt einen Ping-Test für die URL aus und gibt die durchschnittliche Antwortzeit zurück."""
domain = url.replace("https://", "").replace("http://", "").split("/")[0]
try:
result = subprocess.run(["ping", "-c", "4", domain], capture_output=True, text=True)
output = result.stdout
times = re.findall(r'time=(\d+\.\d+)', output)
if times:
times = [float(t) for t in times]
avg_ping = round(sum(times) / len(times), 2)
return f"{avg_ping} ms"
return "Keine Antwort"
except Exception as e:
return "Fehler beim Ping"
def check_headers(url):
"""Prüft verschiedene HTTP-Header einer Webseite und gibt Optimierungstipps aus."""
try:
response = requests.head(url, timeout=10)
headers = response.headers
header_info = {
"Date": headers.get("Date", "Nicht vorhanden"),
"Server": headers.get("Server", "Nicht vorhanden"),
"Strict-Transport-Security": headers.get("Strict-Transport-Security", "Nicht vorhanden"),
"X-Frame-Options": headers.get("x-frame-options", "Nicht vorhanden"),
"X-Content-Type-Options": headers.get("X-Content-Type-Options", "Nicht vorhanden"),
"Referrer-Policy": headers.get("Referrer-Policy", "Nicht vorhanden"),
"Age": headers.get("Age", "Nicht vorhanden"),
"Cache-Control": headers.get("Cache-Control", "Nicht vorhanden"),
"Content-Type": headers.get("Content-Type", "Nicht vorhanden"),
"Ping": get_ping(url),
}
print(f"Überprüfung für {url}")
for key, value in header_info.items():
print(f"{key}: {value}")
print("-" * 80)
except requests.RequestException as e:
print(f"Fehler beim Abrufen der Daten für {url}: {e}")
print("Überprüfe die Erreichbarkeit der Seite.")
def run_header_check():
"""Führt den Header-Test für alle URLs durch."""
for url in URLS:
check_headers(url)
if __name__ == "__main__":
run_header_check()
Fazit
Die richtigen HTTP-Header verbessern nicht nur die Performance, sondern schützen deine Website vor Angriffen. Besonders wichtig sind Cache-Control
, Strict-Transport-Security
und X-Content-Type-Options
.
Viel Erfolg bei der Optimierung deiner Webseite!