Apache-Konfiguration: .htaccess
Apache .htaccess-Dateien ermöglichen es Benutzern, Verzeichnisse des von ihnen kontrollierten Webservers zu konfigurieren, ohne die Hauptkonfigurationsdatei zu ändern.
Obwohl dies nützlich ist, ist es wichtig zu beachten, dass die Verwendung von .htaccess-Dateien Apache verlangsamt. Wenn Sie Zugriff auf die Hauptserverkonfigurationsdatei haben (die normalerweise httpd.conf genannt wird), sollten Sie diese Logik dort unter einem Directory-Block hinzufügen.
Sehen Sie .htaccess auf der Apache HTTPD-Dokumentationsseite für weitere Details darüber, was .htaccess-Dateien tun können.
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 innerhalb des Blocks nur auszuführen, wenn das entsprechende Modul korrekt konfiguriert und vom Server geladen wurde. Auf diese Weise bewahren wir unseren Server vor Abstürzen, falls das Modul nicht geladen wurde.
Umleitungen
Manchmal müssen wir den Benutzern mitteilen, 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 aufgelistet. Wenn der erste Parameter nicht angegeben ist, wird er standardmäßig auf temp gesetzt.
- permanent
-
Gibt einen permanenten Umleitungsstatus (301) zurück, der anzeigt, dass die Ressource dauerhaft verschoben wurde.
- temp
-
Gibt einen temporären Umleitungsstatus (302) zurück. Dies ist der Standard.
- seeother
-
Gibt einen "See Other"-Status (303) zurück, der darauf hinweist, 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.
Cross-Origin-Ressourcen
Der erste Satz von Direktiven steuert den Zugriff von CORS-Ressourcen (Cross-Origin Resource Sharing) vom Server aus. CORS ist ein HTTP-Header-basiertes Mechanismus, der es einem Server ermöglicht, die externen Ursprünge (Domain, Protokoll oder Port) anzugeben, die ein Browser beim Laden von Ressourcen zulassen soll.
Aus Sicherheitsgründen beschränken Browser Cross-Origin-HTTP-Anfragen, die von Skripten initiiert werden. Zum Beispiel, befolgen XMLHttpRequest und die Fetch API die gleiche Herkunftspolitik. Eine Webanwendung, die diese APIs verwendet, kann nur Ressourcen von derselben Herkunft anfordern, von der 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>
Sofern Sie die Direktive nicht später in der Konfiguration oder in der Konfiguration eines Verzeichnisses unterhalb desjenigen, in dem Sie diese gesetzt haben, überschreiben, wird jede Anfrage von externen Servern akzeptiert, was wahrscheinlich nicht das ist, was Sie wollen.
Eine Alternative ist es, explizit festzulegen, welche Domains Zugriff auf die Inhalte Ihrer Website haben. Im folgenden Beispiel beschränken wir den Zugriff auf eine Subdomain unserer Hauptseite (example.com). Dies ist sicherer und vermutlich 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 Use cross-origin images and canvas dokumentiert, kann dies zu Fingerprinting-Angriffen führen.
Um die Möglichkeit solcher Angriffe zu mildern, sollten Sie das crossorigin-Attribut bei den Bildern, die Sie anfordern, und den untenstehenden 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>
Der Google Fonts-Troubleshooting-Leitfaden von Google Chrome teilt mit, dass, obwohl Google Fonts den CORS-Header mit jeder Antwort sendet, einige Proxy-Server diesen möglicherweise entfernen, bevor der Browser ihn verwenden kann, um die Schriftart zu rendern.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|tt[cf]|woff2?)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Cross-Origin-Ressourcen-Timing
Die Resource Timing Spezifikation definiert eine Schnittstelle für Webanwendungen, um vollständige Timing-Informationen für Ressourcen in einem Dokument zu erhalten.
Der Timing-Allow-Origin Antwort-Header gibt Ursprünge an, denen das Anzeigen von Werten von Attributen, die über Funktionen der Resource Timing API abgerufen wurden, erlaubt ist, die ansonsten aufgrund von Cross-Origin-Beschränkungen auf Null gesetzt würden.
Wenn eine Ressource nicht mit einem Timing-Allow-Origin serviert wird oder wenn der Header den Ursprung nach Stellen der Anfrage nicht enthält, werden einige Attribute des PerformanceResourceTiming-Objekts auf Null gesetzt.
<IfModule mod_headers.c>
Header set Timing-Allow-Origin: "*"
</IfModule>
Benutzerdefinierte Fehlerseiten/Nachrichten
Apache ermöglicht Ihnen, benutzerdefinierte Fehlerseiten für Benutzer bereitzustellen, je nachdem, welche Art von Fehler sie erhalten.
Die Fehlerseiten werden als URLs dargestellt. Diese URLs können mit einem Schrägstrich (/) für lokale Webpfade beginnen (relativ zum DocumentRoot) oder eine vollständige URL sein, die der Client auflösen kann.
Sehen Sie die Dokumentation zur ErrorDocument-Direktive auf der HTTPD-Dokumentationsseite für mehr 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."
Fehlervermeidung
Diese Einstellung beeinflusst, wie MultiViews für das Verzeichnis funktioniert, auf das die Konfiguration angewendet wird.
Die Wirkung von MultiViews ist wie folgt: Wenn der Server eine Anfrage für /some/dir/foo erhält, wenn /some/dir MultiViews aktiviert hat und /some/dir/foo nicht existiert, liest der Server das Verzeichnis und sucht nach Dateien namens foo.*, und fälscht effektiv eine Typkarte, die all diese Dateien benennt und ihnen die gleichen Medientypen und Inhaltscodierungen zuweist, als hätte der Client eine von ihnen namentlich angefordert. Er wählt dann das am besten passende zu den Anforderungen des Clients.
Die Einstellung deaktiviert MultiViews für das Verzeichnis, auf das diese Konfiguration angewendet wird, und verhindert, dass Apache als Ergebnis einer Umleitung einen 404-Fehler zurückgibt, wenn das Verzeichnis mit demselben Namen nicht existiert.
Options -MultiViews
Medientypen und Zeichencodierungen
Apache verwendet mod_mime, um Inhaltsmetadaten den für eine HTTP-Antwort ausgewählten Inhalten zuzuordnen, indem Muster in der URI oder Dateinamen auf die Metadatenwerte abgebildet werden.
Zum Beispiel definieren die Dateinamensverlängerungen 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 Inhaltsverhandlung verwendet, wenn Alternativen gewählt werden, sodass die Vorlieben des Benutzers berücksichtigt werden, wenn eine von mehreren möglichen Inhalten gewählt werden soll.
Die Änderung der Metadaten für eine Datei ändert nicht den Wert des Last-Modified-Headers. Daher können zuvor zwischengespeicherte Kopien noch 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 'berühren' (das Datum der letzten Änderung aktualisieren), um sicherzustellen, dass alle Besucher die korrigierten Inhaltsheader erhalten.
Bereitstellung von Ressourcen mit den richtigen Medientypen (alias MIME-Typen)
Ordnet Medientypen einer oder mehreren Erweiterungen zu, 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
# 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>
Standard-Zeichenattribut festlegen
Jedes Stück Inhalt im Web hat einen Zeichensatz. Die meisten, wenn nicht alle, Inhalte sind UTF-8 Unicode.
Verwenden Sie AddDefaultCharset, um alle als text/html oder text/plain gekennzeichneten Ressourcen mit dem UTF-8-Charset bereitzustellen.
<IfModule mod_mime.c>
AddDefaultCharset utf-8
</IfModule>
Zeichensatz für spezifische Medientypen festlegen
Stellen Sie die folgenden Dateitypen mit dem charset-Parameter bereit, der auf UTF-8 gesetzt ist, indem Sie die AddCharset-Direktive verwenden, die in mod_mime verfügbar ist.
<IfModule mod_mime.c>
AddCharset utf-8 \
.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-Anfragen basierend auf regulären Ausdrücken dynamisch zu modifizieren. Dies erlaubt Ihnen, beliebige URLs auf Ihre interne URL-Struktur in beliebiger Weise abzubilden.
Es unterstützt eine unbegrenzte Anzahl von Regeln und eine unbegrenzte Anzahl von angehängten 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 granulare URL-Übereinstimmung zu erreichen.
mod_rewrite aktivieren
Das grundlegende Muster, um mod_rewrite zu aktivieren, ist eine Voraussetzung für alle anderen Aufgaben, die es verwenden.
Die erforderlichen Schritte sind:
- Aktivieren Sie die Rewrite-Engine (dies ist notwendig, damit die
RewriteRule-Direktiven funktionieren) wie in der RewriteEngine-Dokumentation beschrieben - Aktivieren Sie die
FollowSymLinks-Option, falls sie noch nicht aktiviert ist. Siehe Core Options-Dokumentation - Falls Ihr Webhost die
FollowSymlinks-Option nicht zulässt, müssen Sie sie auskommentieren oder entfernen und dann die ZeileOptions +SymLinksIfOwnerMatcheinkommentieren, aber beachten Sie den Performance-Einfluss- Einige Cloud-Hosting-Services erfordern, dass Sie
RewriteBasesetzen - Sehen Sie Rackspace FAQ und die HTTPD-Dokumentation
- Abhängig von der Konfiguration Ihres Servers müssen Sie möglicherweise die
RewriteOptions-Direktive verwenden, um einige Optionen für die Rewrite-Engine zu aktivieren
- Einige Cloud-Hosting-Services erfordern, dass Sie
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymlinks
# Options +SymLinksIfOwnerMatch
# RewriteBase /
# RewriteOptions <options>
</IfModule>
HTTPS erzwingen
Diese Rewrite-Regeln leiten von der unsicheren Version http:// zur sicheren Version https:// 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, schlägt die Zertifikatsvalidierung fehl, wenn Validierungsanfragen zu HTTPS umgeleitet werden. Aktivieren Sie die erforderlichen 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>
Umleitung von www.-URLs
Diese Direktiven werden www.example.com zu example.com umschreiben.
Sie sollten keine Inhalte an mehreren Ursprüngen (mit und ohne www) duplizieren. Dies kann zu SEO-Problemen (doppelter Inhalt) führen, 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 sollten (sofern sie die Funktion unterstützen).
Setzen Sie die %{ENV:PROTO}-Variable, um Umschreibungen zu ermöglichen, die automatisch mit dem entsprechenden Schema (http oder https) umleiten.
Die Regel geht standardmäßig davon aus, dass sowohl HTTP- als auch HTTPS-Umgebungen für Umleitungen 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 fügen www. am Anfang einer URL ein. Es ist wichtig zu beachten, dass Sie niemals denselben Inhalt unter zwei verschiedenen URLs verfügbar machen sollten.
Dies kann zu SEO-Problemen (doppelter Inhalt) führen, 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 sollten.
Setzen Sie die %{ENV:PROTO}-Variable, um Umschreibungen zu ermöglichen, die automatisch mit dem entsprechenden Schema (http oder https) umleiten.
Die Regel geht davon aus, dass sowohl HTTP- als auch HTTPS-Umgebungen für Umleitungen verfügbar sind. Wenn Ihr TLS-Zertifikat eine der während der Umleitung verwendeten Domains nicht verarbeiten kann, sollten Sie die Bedingung aktivieren.
Das Folgende könnte keine gute Idee sein, 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 Antwort-Header mit dem Wert DENY, um dem Browser mitzuteilen, den Inhalt der Webseite nicht in einem beliebigen 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 beiden anderen 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 dies selbst bei jeglicher Einbettung Ihres Inhalts (z.B.: wenn Benutzer Ihre Website über eine Google-Bildsuche-Ergebnisseite besuchen) verbietet.
Nichtsdestotrotz sollten Sie sicherstellen, dass Sie den X-Frame-Options-Header für alle Seiten senden, die es einem Benutzer ermöglichen, eine zustandsverändernde Aktion durchzuführen (z.B. Seiten, die Ein-Klick-Kauf-Links, den Kassen- oder Überweisungsbestätigungsseiten enthalten, Seiten, die dauerhafte Konfigurationsänderungen vornehmen 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 Inhaltsinjektionsangriffen, indem eine Content Security Policy festgelegt wird, die vertrauenswürdige Inhaltequellen für Ihre Website zulässt.
Es gibt keine Politik, die für alle Websites passt, das untenstehende Beispiel ist als Richtlinie gedacht, die Sie für Ihre Website anpassen sollten.
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 möchten.
<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>
Diese CSP:
-
Beschränkt alle Abrufe standardmäßig auf den Ursprung der aktuellen Website, indem die
default-src-Direktive auf'self'gesetzt wird - die als Fallback für alle Fetch-Direktiven fungiert.- Dies ist bequem, da Sie nicht alle auf Ihre Website zutreffenden Fetch-Direktiven angeben müssen, zum Beispiel:
connect-src 'self'; font-src 'self'; script-src 'self'; style-src 'self', usw. - Diese Beschränkung bedeutet auch, dass Sie explizit definieren müssen, von welcher(n) Website(s) Ihre Website erlauben soll, Ressourcen zu laden. Andernfalls wird es auf dieselbe Herkunft wie die Seite, die die Anfrage stellt, beschränkt
- Dies ist bequem, da Sie nicht alle auf Ihre Website zutreffenden Fetch-Direktiven angeben müssen, zum Beispiel:
-
Verbietet das
<base>-Element auf der Website. Dies ist, um zu verhindern, dass Angreifer die Ladeorte von relativ URL-ressourcen ändern.- Wenn Sie das
<base>-Element verwenden möchten, verwenden Sie stattdessenbase-uri 'self'
- Wenn Sie das
-
Erlaubt nur Formularübertragungen vom aktuellen Ursprung mit:
form-action 'self' -
Verhindert, dass alle Websites (einschließlich Ihrer eigenen) Ihre Webseiten innerhalb eines z.B.
<iframe>oder<object>-Elements einbetten, indem:frame-ancestors 'none'gesetzt wird.- Die
frame-ancestors-Direktive hilft, Clickjacking-Angriffe zu vermeiden und ist ähnlich demX-Frame-Options-Header - Browser, die den CSP-Header unterstützen, ignorieren
X-Frame-Options, wennframe-ancestorsebenfalls angegeben ist
- Die
-
Erzwingt den Browser, alle Ressourcen, die über HTTP bereitgestellt werden, so zu behandeln, als ob sie sicher über HTTPS geladen wurden, indem die
upgrade-insecure-requests-Direktive gesetzt wirdupgrade-insecure-requestsstellt kein HTTPS für die Top-Level-Navigation sicher. Wenn Sie möchten, dass die Website selbst über HTTPS geladen wird, müssen Sie denStrict-Transport-Security-Header hinzufügen
-
Enthält den
Content-Security-Policy-Header in allen Antworten, die in der Lage sind, Skripte auszuführen. Dies umfasst die häufig verwendeten Dateitypen: HTML-, XML- und PDF-Dokumente. Obwohl JavaScript-Dateien keine Skripte in einem "Browsing-Kontext" ausführen können, sind sie enthalten, um Web-Arbeiter anzusprechen
Verzeichniszugriff
Diese Direktive verhindert den Zugriff auf Verzeichnisse, die keine Indexdatei im konfigurierten Format des Servers haben, wie index.html oder index.php.
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>
Blockieren des Zugriffs auf versteckte Dateien und Verzeichnisse
In Macintosh- und Linux-Systemen werden Dateien, die mit einem Punkt beginnen, vor Ansicht versteckt, aber nicht vor Zugriff, wenn Sie deren Namen und Standort kennen. Diese Arten von Dateien enthalten normalerweise Benutzerpräferenzen oder den gespeicherten Zustand eines Dienstprogramms und können ziemlich private Bereiche wie z.B. die .git oder .svn-Verzeichnisse umfassen.
Das .well-known/-Verzeichnis stellt den Standard (RFC 5785) für "bekannte Orte" dar (z.B.: /.well-known/manifest.json, /.well-known/keybase.txt), und daher sollte der Zugriff auf dessen sichtbare 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>
Blockieren des Zugriffs auf Dateien mit sensiblen Informationen
Blockieren Sie den Zugriff auf Backup- und Quelldateien, die von einigen Texteditoren hinterlassen werden und ein Sicherheitsrisiko darstellen, wenn jemand Zugriff auf sie hat.
Aktualisieren Sie den <FilesMatch>-Regulären Ausdruck im folgenden Beispiel, um alle Dateien zu enthalten, die möglicherweise auf Ihrem Produktionsserver enden und sensible Informationen über Ihre Website preisgeben 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 seinen Browser eingibt, selbst wenn der Server ihn zur sicheren Version der Website umleitet, bleibt dennoch eine Gelegenheit (die initiale HTTP-Verbindung) für einen Angreifer, die Anfrage herabzustufen oder umzuleiten.
Der folgende Header stellt sicher, dass ein Browser nur über HTTPS mit Ihrem Server verbindet, unabhängig davon, was die Benutzer in die Adressleiste des Browsers eingeben.
Seien Sie sich bewusst, dass Strict Transport Security nicht widerrufbar ist, und Sie müssen sicherstellen, dass Sie in der Lage sind, die Site so lange über HTTPS zu bedienen, wie Sie es im max-age-Direktive 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 den Inhaltstyp der Antwort schnüffeln
Einige ältere Browser versuchen den Inhaltstyp einer Ressource zu erraten, selbst wenn er nicht korrekt in der Serverkonfiguration eingerichtet ist. Dies verringert die Anfälligkeit für Drive-by-Download-Angriffe 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 Antworten für Ressourcen ein, die in der Lage sind, andere Ressourcen anzufordern (oder zu navigieren).
Dies schließt die häufig verwendeten Ressourcentypen ein: HTML, CSS, XML/SVG, PDF-Dokumente, Skripte und Arbeiter.
Um einen vollständigen Referrer-Leck zu verhindern, geben Sie stattdessen den Wert no-referrer an. Beachten Sie, dass sich dies negativ auf Analysewerkzeuge auswirken könnte.
Verwenden Sie Dienste wie die unten aufgeführten, 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 der TRACE-HTTP-Methode
Die TRACE-Methode kann, obwohl sie auf den ersten Blick harmlos erscheint, in einigen Szenarien erfolgreich genutzt werden, um die Anmeldeinformationen legitimer Benutzer zu stehlen. Siehe Ein Cross-Site Tracing (XST) Angriff und OWASP Web Security Testing Guide.
Moderne Browser verhindern mittlerweile TRACE-Anfragen, die über JavaScript gestellt werden, jedoch wurden andere Möglichkeiten entdeckt, TRACE-Anfragen mit Browsern zu senden, z.B. mit Java.
Wenn Sie Zugang zur Hauptserverkonfigurationsdatei haben, verwenden Sie stattdessen die TraceEnable-Direktive.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE [NC]
RewriteRule .* - [R=405,L]
</IfModule>
Entfernen des X-Powered-By-Antwort-Headers
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 keinerlei Nutzen und in manchen Fällen kann die von ihm bereitgestellte Information Schwachstellen offenlegen.
<IfModule mod_headers.c>
Header unset X-Powered-By
Header always unset X-Powered-By
</IfModule>
Wenn möglich, sollten Sie den X-Powered-By-Header von der Sprache/Framework-Ebene aus deaktivieren (z.B.: für PHP können Sie dies tun, indem Sie Folgendes in php.ini einstellen.
expose_php = off;
Entfernen des von Apache generierten Serverinformations-Fußzeilen
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 bereitstellt und die ServerTokens-Direktive für Informationen zur Konfiguration der in der Signatur bereitgestellten Informationen.
ServerSignature Off
Behebung von fehlerhaften AcceptEncoding-Headern
Einige Proxys und Sicherheitssoftware verunstalten oder entfernen den Accept-Encoding HTTP-Header. Siehe Pushing Beyond Gzipping 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>
Medien-Typen 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 abbilden
Ordnen Sie die folgenden Dateinamenerweiterungen der angegebenen Kodierungsart zu, indem Sie AddEncoding verwenden, damit Apache die Dateitypen mit dem entsprechenden Content-Encoding Antwort-Header bereitstellen kann (dies wird NICHT Apache dazu bringen, sie zu komprimieren!). Wenn diese Dateitypen ohne einen geeigneten Content-Encoding Antwort-Header bereitgestellt würden, wüssten Client-Anwendungen (z.B. Browser) nicht, dass sie die Antwort zuerst dekomprimieren müssen, und könnten den Inhalt somit nicht verstehen.
<IfModule mod_deflate.c>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
Cache-Ablauf
Stellen Sie Ressourcen mit einem langem Ablaufdatum in der Zukunft bereit, indem Sie das mod_expires-Modul und die Cache-Control und Expires-Header verwenden.
<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>