Apache-Konfiguration: .htaccess
Apache .htaccess-Dateien ermöglichen es Benutzern, Verzeichnisse des Webservers zu konfigurieren, die sie kontrollieren, ohne die Hauptkonfigurationsdatei zu ändern.
Während dies nützlich ist, sollte beachtet werden, dass die Verwendung von .htaccess
-Dateien Apache verlangsamt. Wenn Sie Zugang zur Hauptserver-Konfigurationsdatei haben (die normalerweise httpd.conf
genannt wird), sollten Sie diese Logik stattdessen dort in einem Directory
-Block hinzufügen.
Weitere Details darüber, was .htaccess-Dateien tun können, finden Sie in der .htaccess-Dokumentation auf der Apache HTTPD-Dokumentationsseite.
Der Rest dieses Dokuments wird verschiedene Konfigurationsoptionen besprechen, die Sie zu .htaccess
hinzufügen können und was sie bewirken.
Die meisten der folgenden Blöcke verwenden die IfModule-Direktive, um die Anweisungen im Block nur auszuführen, wenn das entsprechende Modul ordnungsgemäß konfiguriert wurde und der Server es geladen hat. Auf diese Weise schützen wir unseren Server davor, abzustürzen, wenn das Modul nicht geladen wurde.
Umleitungen
Es gibt Zeiten, in denen wir Benutzern mitteilen müssen, dass eine Ressource entweder vorübergehend oder dauerhaft verschoben wurde. Dafür verwenden wir Redirect
und RedirectMatch
.
<IfModule mod_alias.c>
# Redirect to a URL on a different host
Redirect "/service" "http://foo2.example.com/service"
# Redirect to a URL on the same host
Redirect "/one" "/two"
# Equivalent redirect to URL on the same host
Redirect temp "/one" "/two"
# Permanent redirect to a URL on the same host
Redirect permanent "/three" "/four"
# Redirect to an external URL
# Using regular expressions and RedirectMatch
RedirectMatch "^/oldfile\.html/?$" "http://example.com/newfile.php"
</IfModule>
Die möglichen Werte für den ersten Parameter sind unten aufgeführt. Wenn der erste Parameter nicht enthalten ist, wird er standardmäßig auf temp
gesetzt.
- permanent
-
Gibt einen permanenten Redirect-Status (301) zurück, der anzeigt, dass die Ressource dauerhaft verschoben wurde.
- temp
-
Gibt einen temporären Redirect-Status (302) zurück. Dies ist der Standard.
- seeother
-
Gibt einen "See Other"-Status (303) zurück, der anzeigt, dass die Ressource ersetzt wurde.
- gone
-
Gibt einen "Gone"-Status (410) zurück, der anzeigt, dass die Ressource dauerhaft entfernt wurde. Wenn dieser Status verwendet wird, sollte das URL-Argument weggelassen werden.
Ressourcen für Cross-Origin
Der erste Satz von Direktiven steuert den CORS (Cross-Origin Resource Sharing)-Zugriff auf Ressourcen vom Server. CORS ist ein HTTP-Header-basiertes Mechanismus, das es einem Server ermöglicht, die externen Ursprünge (Domain, Protokoll oder Port) anzugeben, die ein Browser zum Laden von Ressourcen zulassen soll.
Aus Sicherheitsgründen beschränken Browser Cross-Origin-HTTP-Anfragen, die von Skripten initiiert werden. Zum Beispiel folgen XMLHttpRequest
und die Fetch API
der Same-Origin-Policy. Eine Webanwendung, die diese APIs verwendet, kann nur Ressourcen von demselben Ursprung anfordern, von dem die Anwendung geladen wurde, es sei denn, die Antwort von anderen Ursprüngen enthält die entsprechenden CORS-Header.
Allgemeiner CORS-Zugriff
Diese Direktive fügt den CORS-Header für alle Ressourcen im Verzeichnis von jeder Website hinzu.
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Es sei denn, Sie überschreiben die Direktive später in der Konfiguration oder in der Konfiguration eines Verzeichnisses unterhalb desjenigen, in dem Sie diese gesetzt haben, werden alle Anfragen von externen Servern akzeptiert, was wahrscheinlich nicht das ist, was Sie wollen.
Eine Alternative ist, explizit anzugeben, welche Domains Zugriff auf den Inhalt Ihrer Website haben. Im folgenden Beispiel beschränken wir den Zugriff auf eine Subdomain unserer Hauptseite (example.com). Dies ist sicherer und wahrscheinlich das, was Sie beabsichtigten.
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "subdomain.example.com"
</IfModule>
Cross-Origin Bilder
Wie im Chromium Blog berichtet und in Verwendung von Cross-Origin-Bildern und Canvas dokumentiert, können zu Fingerprinting-Angriffen führen.
Um die Möglichkeit dieser Angriffe zu minimieren, sollten Sie das crossorigin
-Attribut in den Bildern, die Sie anfordern, und den folgenden Codeausschnitt in Ihrer .htaccess
verwenden, um den CORS-Header vom Server zu setzen.
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch "\.(bmp|cur|gif|ico|jpe?g|a?png|svgz?|webp|heic|heif|avif)$">
SetEnvIf Origin ":" IS_CORS
Header set Access-Control-Allow-Origin "*" env=*IS_CORS*
</FilesMatch>
</IfModule>
</IfModule>
Googles Chrome Google Fonts Fehlerbehebungsleitfaden teilt uns mit, dass, obwohl Google Fonts den CORS-Header mit jeder Antwort senden könnte, einige Proxy-Server ihn möglicherweise herausfiltern, bevor der Browser ihn verwenden kann, um die Schrift zu rendern.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Cross-Origin Resource Timing
Die Resource Timing Level 1-Spezifikation definiert eine Schnittstelle für Webanwendungen zum Zugriff auf die vollständigen Timing-Informationen für Ressourcen in einem Dokument.
Der Timing-Allow-Origin-Antwortheader spezifiziert Ursprünge, die berechtigt sind, die Werte von Attributen, die über Funktionen der Resource Timing API abgerufen werden, anzuzeigen, die sonst aufgrund von Cross-Origin-Einschränkungen als Null gemeldet würden.
Wenn eine Ressource nicht mit einem Timing-Allow-Origin
serviert wird oder wenn der Header, der nach der Anforderung nicht den Ursprung einschließt, einige Attribute des PerformanceResourceTiming
-Objekts auf Null gesetzt werden.
<IfModule mod_headers.c>
Header set Timing-Allow-Origin: "*"
</IfModule>
Benutzerdefinierte Fehlerseiten/-nachrichten
Apache ermöglicht es Ihnen, benutzerdefinierte Fehlerseiten je nach Art des Fehlers, den die Benutzer erhalten, bereitzustellen.
Die Fehlerseiten werden als URLs dargestellt. Diese URLs können mit einem Schrägstrich (/) für lokale Webpfade (relativ zum DocumentRoot) beginnen oder eine vollständige URL sein, die der Client auflösen kann.
Siehe die ErrorDocument-Direktive-Dokumentation auf der HTTPD-Dokumentationsseite für weitere Informationen.
ErrorDocument 500 /errors/500.html
ErrorDocument 404 /errors/400.html
ErrorDocument 401 https://example.com/subscription_info.html
ErrorDocument 403 "Sorry, can't allow you access today."
Fehlerprävention
Diese Einstellung beeinflusst, wie MultiViews für das Verzeichnis funktionieren, für das die Konfiguration gilt.
Die Wirkung von MultiViews
ist wie folgt: Wenn der Server eine Anforderung für /some/dir/foo erhält, wenn /some/dir MultiViews
aktiviert hat und /some/dir/foo nicht existiert, dann liest der Server das Verzeichnis und sucht nach Dateien, die foo.* genannt werden, und erstellt effektiv eine Typkarte, die alle diese Dateien benannt werden und ihnen die gleichen Medientypen und Inhaltscodierungen zuweist, die sie hätten, wenn der Client eine von ihnen namentlich angefordert hätte. Es wählt dann die beste Übereinstimmung mit den Anforderungen des Clients aus.
Die Einstellung deaktiviert MultiViews
für das Verzeichnis, für das diese Konfiguration gilt, und verhindert, dass Apache als Ergebnis einer Umschreibung einen 404-Fehler zurückgibt, wenn das Verzeichnis mit demselben Namen nicht existiert.
Options -MultiViews
Medientypen und Zeichencodierungen
Apache verwendet mod_mime, um Inhaltsmetadaten dem ausgewählten Inhalt für eine HTTP-Antwort zuzuordnen, indem Muster in der URI oder Dateinamen auf die Metadatenwerte abgebildet werden.
Zum Beispiel definieren die Dateinamenerweiterungen von Inhaltsdateien oft den Internet-Medientyp, die Sprache, den Zeichensatz und die Inhaltscodierung des Inhalts. Diese Informationen werden in HTTP-Nachrichten gesendet, die diesen Inhalt enthalten, und werden bei der Inhaltsaushandlung verwendet, wenn Alternativen ausgewählt werden, sodass die Präferenzen des Benutzers bei der Auswahl eines von mehreren möglichen Inhalten berücksichtigt werden.
Die Änderung der Metadaten für eine Datei ändert nicht den Wert des Last-Modified-Headers. Daher können zuvor zwischengespeicherte Kopien weiterhin von einem Client oder Proxy verwendet werden, mit den vorherigen Headern. Wenn Sie die Metadaten (Sprache, Inhaltstyp, Zeichensatz oder Codierung) ändern, müssen Sie möglicherweise die betroffenen Dateien "anfassen" (Änderung ihres letzten Änderungsdatums), um sicherzustellen, dass alle Besucher die korrigierten Inhaltsheader erhalten.
Ressourcen mit den richtigen Medientypen (auch bekannt als MIME-Typen) bereitstellen
Verknüpft Medientypen mit einer oder mehreren Erweiterungen, um sicherzustellen, dass die Ressourcen entsprechend bereitgestellt werden.
Server sollten text/javascript
für JavaScript-Ressourcen verwenden, wie in der HTML-Spezifikation angegeben.
<IfModule mod_mime.c>
# Data interchange
AddType application/atom+xml atom
AddType application/json json map topojson
AddType application/ld+json jsonld
AddType application/rss+xml rss
AddType application/geo+json geojson
AddType application/rdf+xml rdf
AddType application/xml xml
# JavaScript
AddType text/javascript js mjs
# Manifest files
AddType application/manifest+json webmanifest
AddType application/x-web-app-manifest+json webapp
AddType text/cache-manifest appcache
# Media files
AddType audio/mp4 f4a f4b m4a
AddType audio/ogg oga ogg opus
AddType image/bmp bmp
AddType image/svg+xml svg svgz
AddType image/webp webp
AddType video/mp4 f4v f4p m4v mp4
AddType video/ogg ogv
AddType video/webm webm
AddType image/x-icon cur ico
# HEIF Images
AddType image/heic heic
AddType image/heif heif
# HEIF Image Sequence
AddType image/heics heics
AddType image/heifs heifs
# AVIF Images
AddType image/avif avif
# AVIF Image Sequence
AddType image/avis avis
# WebAssembly
AddType application/wasm wasm
# Web fonts
AddType font/woff woff
AddType font/woff2 woff2
AddType application/vnd.ms-fontobject eot
AddType font/ttf ttf
AddType font/collection ttc
AddType font/otf otf
# Other
AddType application/octet-stream safariextz
AddType application/x-bb-appworld bbaw
AddType application/x-chrome-extension crx
AddType application/x-opera-extension oex
AddType application/x-xpinstall xpi
AddType text/calendar ics
AddType text/markdown markdown md
AddType text/vcard vcard vcf
AddType text/vnd.rim.location.xloc xloc
AddType text/vtt vtt
AddType text/x-component htc
</IfModule>
Setzen Sie das Standard-Zeichensatzattribut
Jedes Stück Inhalt im Web hat einen Zeichensatz. Der meiste, wenn nicht der gesamte Inhalt ist UTF-8 Unicode.
Verwenden Sie AddDefaultCharset, um alle Ressourcen, die als text/html
oder text/plain
gekennzeichnet sind, mit dem UTF-8
Zeichensatz zu bedienen.
<IfModule mod_mime.c>
AddDefaultCharset utf-8
</IfModule>
Setzen Sie den Zeichensatz für spezifische Medientypen
Stellen Sie die folgenden Dateitypen mit dem charset
-Parameter, der auf UTF-8
gesetzt ist, unter Verwendung der AddCharset-Direktive bereit, die in mod_mime
verfügbar ist.
<IfModule mod_mime.c>
AddCharset utf-8 .appcache \
.bbaw \
.css \
.htc \
.ics \
.js \
.json \
.manifest \
.map \
.markdown \
.md \
.mjs \
.topojson \
.vtt \
.vcard \
.vcf \
.webmanifest \
.xloc
</IfModule>
Mod_rewrite
und die RewriteEngine
-Direktiven
mod_rewrite bietet eine Möglichkeit, eingehende URL-Anforderungen dynamisch basierend auf regulären Ausdrücken zu ändern. Dies ermöglicht es Ihnen, beliebige URLs auf Ihre interne URL-Struktur in beliebiger Weise abzubilden.
Es unterstützt eine unbegrenzte Anzahl von Regeln und eine unbegrenzte Anzahl angeschlossener Regelbedingungen für jede Regel, um einen wirklich flexiblen und leistungsstarken URL-Manipulationsmechanismus bereitzustellen. Die URL-Manipulationen können von verschiedenen Tests abhängen: Servervariablen, Umgebungsvariablen, HTTP-Header, Zeitstempel, externe Datenbankabfragen und verschiedene andere externe Programme oder Handler können verwendet werden, um eine fein abgestimmte URL-Mustererkennung zu erreichen.
mod_rewrite
aktivieren
Das Grundmuster zur Aktivierung von mod_rewrite
ist eine Voraussetzung für alle anderen Aufgaben, die es verwenden.
Die erforderlichen Schritte sind:
-
Schalten Sie die Rewrite-Engine ein (dies ist notwendig, damit die
RewriteRule
-Direktiven funktionieren), wie in der RewriteEngine-Dokumentation beschrieben -
Aktivieren Sie die
FollowSymLinks
-Option, falls diese nicht bereits aktiviert ist. Siehe Core Options-Dokumentation -
Wenn Ihr Webhost die
FollowSymlinks
-Option nicht zulässt, müssen Sie sie auskommentieren oder entfernen und dann die ZeileOptions +SymLinksIfOwnerMatch
auskommentieren, aber beachten Sie die Leistungsbeeinträchtigungen- Einige Cloud-Hosting-Dienste erfordern, dass Sie
RewriteBase
setzen - Siehe Rackspace FAQ und die HTTPD-Dokumentation
- Abhängig davon, wie Ihr Server eingerichtet ist, müssen Sie möglicherweise die
RewriteOptions
-Direktive verwenden, um einige Optionen für die Rewrite-Engine zu aktivieren
- Einige Cloud-Hosting-Dienste erfordern, dass Sie
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymlinks
# Options +SymLinksIfOwnerMatch
# RewriteBase /
# RewriteOptions <options>
</IfModule>
Erzwingen von HTTPS
Diese Rewrite-Regeln leiten von der unsicheren http://
-Version zur sicheren https://
-Version der URL um, wie im Apache HTTPD-Wiki beschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>
Wenn Sie das cPanel AutoSSL oder die Let's Encrypt Webroot-Methode verwenden, um Ihre TLS-Zertifikate zu erstellen, wird das Zertifikat nicht validiert, wenn Validierungsanforderungen zu HTTPS umgeleitet werden. Aktivieren Sie die benötigte(n) Bedingung(en).
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{REQUEST_URI} !^/\.well-known/acme-challenge/
RewriteCond %{REQUEST_URI} !^/\.well-known/cpanel-dcv/[\w-]+$
RewriteCond %{REQUEST_URI} !^/\.well-known/pki-validation/[A-F0-9]{32}\.txt(?:\ Comodo\ DCV)?$
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
Umleiten von www.
-URLs
Diese Direktiven werden www.example.com
in example.com
umschreiben.
Sie sollten keine Inhalte in mehreren Ursprüngen (mit und ohne www) duplizieren. Dies kann SEO-Probleme (doppelter Inhalt) verursachen, und daher sollten Sie eine der Alternativen wählen und die andere umleiten. Sie sollten auch Canonical URLs verwenden, um anzugeben, welche URL Suchmaschinen crawlen sollen (wenn sie die Funktion unterstützen).
Setzen Sie die %{ENV:PROTO}
-Variable, um Umschreibungen automatisch mit dem entsprechenden Schema (http
oder https
) umleiten zu lassen.
Die Regel geht standardmäßig davon aus, dass sowohl HTTP- als auch HTTPS-Umgebungen für die Umleitung verfügbar sind.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} =on
RewriteRule ^ - [E=PROTO:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^ - [E=PROTO:http]
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ %{ENV:PROTO}://%1%{REQUEST_URI} [R=301,L]
</IfModule>
Einfügen von www.
am Anfang von URLs
Diese Regeln werden www.
am Anfang einer URL einfügen. Es ist wichtig zu beachten, dass Sie niemals denselben Inhalt unter zwei verschiedenen URLs verfügbar machen sollten.
Dies kann SEO-Probleme (doppelter Inhalt) verursachen, und daher sollten Sie eine der Alternativen wählen und die andere umleiten. Für Suchmaschinen, die sie unterstützen, sollten Sie Canonical URLs verwenden, um anzugeben, welche URL Suchmaschinen crawlen sollen.
Setzen Sie die %{ENV:PROTO}
-Variable, um Umschreibungen automatisch mit dem entsprechenden Schema (http
oder https
) umleiten zu lassen.
Die Regel geht standardmäßig davon aus, dass sowohl HTTP- als auch HTTPS-Umgebungen für die Umleitung verfügbar sind. Wenn Ihr TLS-Zertifikat eines der während der Umleitung verwendeten Domains nicht verarbeiten kann, sollten Sie die Bedingung aktivieren.
Das Folgende ist möglicherweise keine gute Idee, wenn Sie "echte" Subdomains für bestimmte Teile Ihrer Website verwenden.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} =on
RewriteRule ^ - [E=PROTO:https]
RewriteCond %{HTTPS} !=on
RewriteRule ^ - [E=PROTO:http]
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{SERVER_ADDR} !=127.0.0.1
RewriteCond %{SERVER_ADDR} !=::1
RewriteRule ^ %{ENV:PROTO}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
Frame-Optionen
Das folgende Beispiel sendet den X-Frame-Options
-Antwortheader mit dem Wert DENY und teilt den Browsern mit, den Inhalt der Webseite in keinem Frame anzuzeigen, um die Website vor Clickjacking zu schützen.
Dies ist möglicherweise nicht die beste Einstellung für jeden. Sie sollten über die anderen beiden möglichen Werte für den X-Frame-Options
-Header lesen: SAMEORIGIN
und ALLOW-FROM
.
Obwohl Sie den X-Frame-Options
-Header für alle Seiten Ihrer Website senden könnten, hat dies den potenziellen Nachteil, dass es sogar jegliche Einrahmung Ihres Inhalts verbietet (z.B.: wenn Nutzer Ihre Website über eine Google-Bildersuche-Ergebnisseite besuchen).
Dennoch sollten Sie sicherstellen, dass Sie den X-Frame-Options
-Header für alle Seiten senden, die einem Nutzer ermöglichen, eine statusändernde Operation auszuführen (z.B. Seiten, die Ein-Klick-Kauf-Links, Checkout- oder Bank-Transfer-Bestätigungsseiten, Seiten, die dauerhafte Konfigurationsänderungen enthalten, usw.).
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY" "expr=%{CONTENT_TYPE} =~ m#text/html#i"
</IfModule>
Content Security Policy (CSP)
CSP (Content Security Policy) mindert das Risiko von Cross-Site-Scripting und anderen Inhaltseinschleussungsangriffen durch Setzen einer Content Security Policy
, die vertrauenswürdige Quellen von Inhalten für Ihre Website erlaubt.
Es gibt keine Richtlinie, die für alle Websites passt, das folgende Beispiel soll als Richtlinien dienen, die Sie für Ihre Seite anpassen.
Um Ihre CSP-Implementierung zu erleichtern, können Sie einen Online CSP-Header-Generator verwenden. Sie sollten auch einen Validator verwenden, um sicherzustellen, dass Ihr Header das tut, was Sie wollen, dass er tut.
<IfModule mod_headers.c>
Content-Security-Policy "default-src 'self'; base-uri 'none'; form-action 'self'; frame-ancestors 'none'; upgrade-insecure-requests" "expr=%{CONTENT_TYPE} =~ m#text\/(html|javascript)|application\/pdf|xml#i"
</IfModule>
Verzeichniszugriff
Diese Direktive verhindert den Zugriff auf Verzeichnisse, die keine Indexdatei in welchem Format auch immer der Server konfiguriert ist, zu verwenden, wie index.html
oder index.php
, haben.
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
Zugriff auf versteckte Dateien und Verzeichnisse blockieren
In Macintosh- und Linux-Systemen sind Dateien, die mit einem Punkt beginnen, vor der Ansicht versteckt, aber nicht vor dem Zugriff, wenn Sie ihren Namen und Ort kennen. Diese Art von Dateien enthält normalerweise Benutzerpräferenzen oder den konservierten Zustand eines Dienstprogramms und kann eher private Orte einschließen wie beispielsweise die .git
- oder .svn
-Verzeichnisse.
Das Verzeichnis .well-known/
stellt den Standardpfad (RFC 5785) für "wohlbekannte Orte" dar (z.B.: /.well-known/manifest.json
, /.well-known/keybase.txt
), und daher sollte der Zugriff auf seine sichtbaren Inhalte nicht blockiert werden.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC]
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
</IfModule>
Zugriff auf Dateien mit sensiblen Informationen blockieren
Blockiert den Zugriff auf Backup- und Quelldateien, die von einigen Texteditoren übrig bleiben und ein Sicherheitsrisiko darstellen können, wenn jemand Zugriff darauf hat.
Aktualisieren Sie das <FilesMatch>
-reguläres Ausdruck im folgenden Beispiel, um alle Dateien aufzunehmen, die möglicherweise auf Ihrem Produktionsserver landen und sensible Informationen über Ihre Website offenlegen können. Diese Dateien können Konfigurationsdateien oder Dateien sein, die Metadaten über das Projekt enthalten, unter anderem.
<IfModule mod_authz_core.c>
<FilesMatch "(^#.*#|\.(bak|conf|dist|fla|in[ci]|log|orig|psd|sh|sql|sw[op])|~)$">
Require all denied
</FilesMatch>
</IfModule>
HTTP Strict Transport Security (HSTS)
Wenn ein Benutzer example.com
in seinem Browser eingibt, selbst wenn der Server ihn zur sicheren Version der Website umleitet, bleibt dennoch ein Fenster der Möglichkeit (der anfängliche HTTP-Verbindung) für einen Angreifer offen, um die Anforderung herunterzustufen oder umzuleiten.
Der folgende Header stellt sicher, dass ein Browser nur über HTTPS mit Ihrem Server verbindet, unabhängig davon, was die Benutzer in der Adressleiste des Browsers eingeben.
Seien Sie sich bewusst, dass Strict Transport Security nicht widerrufbar ist, und Sie müssen sicherstellen, dass Sie die Seite über HTTPS bedienen können, solange Sie im max-age
-Directive angegeben haben. Wenn Sie keine gültige TLS-Verbindung mehr haben (z.B. aufgrund eines abgelaufenen TLS-Zertifikats), sehen Ihre Besucher eine Fehlermeldung, selbst wenn sie versuchen, über HTTP zu verbinden.
<IfModule mod_headers.c>
# Header always set
Strict-Transport-Security "max-age=16070400; includeSubDomains" "expr=%{HTTPS} == 'on'"
# (1) Enable your site for HSTS preload inclusion.
# Header always set
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'"
</IfModule>
Verhindern, dass einige Browser das Antwort-MIME-Sniffing durchführen
-
Beschränkt alle Abrufe standardmäßig auf den Ursprung der aktuellen Website, indem die
default-src
-Direktive auf'self'
gesetzt wird - was als Fallback für alle Fetch-Direktiven fungiert.- Das ist bequem, da Sie nicht alle Fetch-Direktiven angeben müssen, die für Ihre Seite gelten, zum Beispiel:
connect-src 'self'; font-src 'self'; script-src 'self'; style-src 'self';
etc - Diese Einschränkung bedeutet auch, dass Sie explizit definieren müssen, von welcher/n Seite(n) Ihre Website Ressourcen laden darf. Andernfalls wird es auf denselben Ursprung wie die Seite, die die Anforderung stellt, beschränkt sein
- Das ist bequem, da Sie nicht alle Fetch-Direktiven angeben müssen, die für Ihre Seite gelten, zum Beispiel:
-
Verhindert die Verwendung des
<base>
-Elements auf der Website. Dies soll verhindern, dass Angreifer die Standorte von Ressourcen relativ zu URLs ändern- Wenn Sie das
<base>
-Element verwenden möchten, dann verwenden Siebase-uri 'self'
stattdessen
- Wenn Sie das
-
Erlaubt nur Formularübermittlungen vom aktuellen Ursprung mit:
form-action 'self'
-
Verhindert, dass alle Websites (einschließlich Ihrer eigenen) Ihre Webseiten innerhalb z.B. des
<iframe>
oder<object>
-Elements einbetten, indem:frame-ancestors 'none'
gesetzt wird.- Die
frame-ancestors
-Direktive hilft, Clickjacking-Angriffe zu vermeiden und ist ähnlich wie derX-Frame-Options
-Header - Browser, die den CSP-Header unterstützen, ignorieren
X-Frame-Options
, wennframe-ancestors
ebenfalls angegeben ist
- Die
-
Zwingt den Browser, alle Ressourcen, die über HTTP bereitgestellt werden, so zu behandeln, als ob sie sicher über HTTPS geladen wurden, durch Setzen der
upgrade-insecure-requests
-Direktiveupgrade-insecure-requests
stellt nicht sicher, dass die Top-Level-Navigation über HTTPS erfolgt. Wenn Sie erzwingen möchten, dass die Website selbst über HTTPS geladen wird, müssen Sie denStrict-Transport-Security
-Header einfügen
-
Schließt den
Content-Security-Policy
-Header in alle Antworten ein, die in der Lage sind, Skripte auszuführen. Dies schließt die üblicherweise verwendeten Dateitypen ein: HTML-, XML- und PDF-Dokumente. Obwohl JavaScript-Dateien keine Skripte in einem "Browsing-Kontext" ausführen können, werden sie aufgenommen, um auf Web-Worker abzuzielen
Einige ältere Browser würden versuchen, den Inhaltstyp einer Ressource zu erraten, selbst wenn er nicht richtig in der Serverkonfiguration eingerichtet ist. Dies verringert die Exposition gegenüber Drive-by-Download-Angriffen und Cross-Origin-Datenlecks.
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
Referrer-Richtlinie
Wir fügen den Referrer-Policy
-Header in die Antworten für Ressourcen ein, die in der Lage sind, andere Ressourcen anzufordern (oder zu navigieren).
Das schließt üblicherweise verwendete Ressourcentypen ein: HTML-, CSS-, XML/SVG-, PDF-Dokumente, Skripte und Worker.
Um Referrer-Lecks vollständig zu verhindern, geben Sie stattdessen den Wert no-referrer
an. Beachten Sie, dass sich dies negativ auf Analysetools auswirken könnte.
Verwenden Sie Dienste wie die unten genannten, um Ihre Referrer-Policy
zu überprüfen:
<IfModule mod_headers.c>
Header always set Referrer-Policy "strict-origin-when-cross-origin" "expr=%{CONTENT_TYPE} =~ m#text\/(css|html|javascript)|application\/pdf|xml#i"
</IfModule>
Deaktivieren Sie die TRACE
HTTP-Methode
Die TRACE Methode, obwohl scheinbar harmlos, kann in einigen Szenarien erfolgreich genutzt werden, um Anmeldeinformationen legitimer Benutzer zu stehlen. Siehe Ein Cross-Site-Tracing (XST)-Angriff und OWASP Web Security Testing Guide
Moderne Browser verhindern jetzt TRACE-Anfragen, die über JavaScript gestellt werden, aber andere Möglichkeiten, TRACE-Anfragen mit Browsern zu senden, wurden entdeckt, wie die Verwendung von Java.
Wenn Sie Zugang zur Hauptserver-Konfigurationsdatei haben, verwenden Sie stattdessen die TraceEnable
-Direktive.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE [NC]
RewriteRule .* - [R=405,L]
</IfModule>
Entfernen Sie den X-Powered-By
-Antwortheader
Einige Frameworks wie PHP und ASP.NET setzen einen X-Powered-By
-Header, der Informationen über sie enthält (z.B. ihren Namen, Versionsnummer)
Dieser Header bietet keinen Mehrwert, und in einigen Fällen können die Informationen, die er bietet, Schwachstellen offenlegen
<IfModule mod_headers.c>
Header unset X-Powered-By
Header always unset X-Powered-By
</IfModule>
Wenn Sie können, sollten Sie den X-Powered-By
-Header auf der Sprachebene/Frameworkebene deaktivieren (z.B.: für PHP, können Sie das tun, indem Sie das Folgende in php.ini
setzen.
expose_php = off;
Entfernen Sie den von Apache generierten Serverinformationen-Fußzeile
Verhindern Sie, dass Apache eine abschließende Fußzeile, die Informationen über den Server enthält, zu servergenerierten Dokumenten (z.B. Fehlermeldungen, Verzeichnislisten usw.) hinzufügt. Siehe die ServerSignature
-Direktive-Dokumentation für weitere Informationen darüber, was die Server-Signatur bietet und die ServerTokens
-Direktive für Informationen über das Konfigurieren der Informationen, die in der Signatur bereitgestellt werden.
ServerSignature Off
Behebung fehlerhafter AcceptEncoding
-Header
Einige Proxies und Sicherheitssoftware beschädigen oder entfernen den Accept-Encoding
HTTP-Header. Siehe Beyond Gzipping hinausgehen für eine detailliertere Erklärung.
<IfModule mod_deflate.c>
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding
RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding
</IfModule>
</IfModule>
</IfModule>
Medientypen komprimieren
Komprimieren Sie alle Ausgaben, die mit einem der folgenden Medientypen gekennzeichnet sind, mit der AddOutputFilterByType-Direktive.
<IfModule mod_deflate.c>
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE "application/atom+xml" \
"application/javascript" \
"application/json" \
"application/ld+json" \
"application/manifest+json" \
"application/rdf+xml" \
"application/rss+xml" \
"application/schema+json" \
"application/geo+json" \
"application/vnd.ms-fontobject" \
"application/wasm" \
"application/x-font-ttf" \
"application/x-javascript" \
"application/x-web-app-manifest+json" \
"application/xhtml+xml" \
"application/xml" \
"font/eot" \
"font/opentype" \
"font/otf" \
"font/ttf" \
"image/bmp" \
"image/svg+xml" \
"image/vnd.microsoft.icon" \
"text/cache-manifest" \
"text/calendar" \
"text/css" \
"text/html" \
"text/javascript" \
"text/plain" \
"text/markdown" \
"text/vcard" \
"text/vnd.rim.location.xloc" \
"text/vtt" \
"text/x-component" \
"text/x-cross-domain-policy" \
"text/xml"
</IfModule>
</IfModule>
Erweiterungen zu Medientypen zuordnen
Ordnen Sie die folgenden Dateinamenerweiterungen dem angegebenen Codierungstyp mit AddEncoding zu, sodass Apache die Dateitypen mit dem entsprechenden Content-Encoding
-Antwortheader bereitstellen kann (das wird NICHT Apache zwingen, sie zu komprimieren!). Wenn diese Dateitypen ohne einen geeigneten Content-Encoding
-Antwortheader bereitgestellt würden, könnten Client-Anwendungen (z.B. Browser) nicht wissen, dass sie die Antwort zuerst dekomprimieren müssen, und somit nicht in der Lage sein würden, den Inhalt zu verstehen.
<IfModule mod_deflate.c>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
Cache-Ablauf
Dienen Sie Ressourcen mit einem weit in der Zukunft liegenden Ablaufdatum mit dem mod_expires-Modul und den Cache-Control und Expires Headers.
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Data interchange
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rdf+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/ld+json "access plus 0 seconds"
ExpiresByType application/schema+json "access plus 0 seconds"
ExpiresByType application/geo+json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/calendar "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (cannot be renamed!) and cursor images
ExpiresByType image/vnd.microsoft.icon "access plus 1 week"
ExpiresByType image/x-icon "access plus 1 week"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType text/javascript "access plus 1 year"
# Manifest files
ExpiresByType application/manifest+json "access plus 1 week"
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Markdown
ExpiresByType text/markdown "access plus 0 seconds"
# Media files
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
ExpiresByType image/webp "access plus 1 month"
# PNG and animated PNG
ExpiresByType image/apng "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
# HEIF Images
ExpiresByType image/heic "access plus 1 month"
ExpiresByType image/heif "access plus 1 month"
# HEIF Image Sequence
ExpiresByType image/heics "access plus 1 month"
ExpiresByType image/heifs "access plus 1 month"
# AVIF Images
ExpiresByType image/avif "access plus 1 month"
# AVIF Image Sequence
ExpiresByType image/avis "access plus 1 month"
ExpiresByType video/mp4 "access plus 1 month"
ExpiresByType video/ogg "access plus 1 month"
ExpiresByType video/webm "access plus 1 month"
# WebAssembly
ExpiresByType application/wasm "access plus 1 year"
# Web fonts
# Collection
ExpiresByType font/collection "access plus 1 month"
# Embedded OpenType (EOT)
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType font/eot "access plus 1 month"
# OpenType
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType font/otf "access plus 1 month"
# TrueType
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/ttf "access plus 1 month"
# Web Open Font Format (WOFF) 1.0
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/x-font-woff "access plus 1 month"
ExpiresByType font/woff "access plus 1 month"
# Web Open Font Format (WOFF) 2.0
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType font/woff2 "access plus 1 month"
# Other
ExpiresByType text/x-cross-domain-policy "access plus 1 week"
</IfModule>