Apache-Konfiguration: .htaccess
Apache .htaccess-Dateien ermöglichen es Benutzern, Verzeichnisse des von ihnen kontrollierten Webservers zu konfigurieren, ohne die Haupt-Konfigurationsdatei zu ändern.
Obwohl dies nützlich ist, ist es wichtig zu beachten, dass die Verwendung von .htaccess-Dateien Apache verlangsamt. Wenn Sie Zugang zur Hauptserver-Konfigurationsdatei haben (die üblicherweise httpd.conf genannt wird), sollten Sie diese Logik dort unter einem Directory-Block hinzufügen.
Weitere Details dazu, was .htaccess-Dateien leisten können, finden Sie unter .htaccess in der Apache HTTPD-Dokumentation.
Der Rest dieses Dokuments wird verschiedene Konfigurationsoptionen behandeln, 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 wurde und der Server es geladen hat. Auf diese Weise schützen wir unseren Server davor, abzustürzen, falls 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 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 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.
Cross-Origin-Ressourcen
Der erste Satz von Direktiven steuert den CORS (Cross-Origin Resource Sharing)-Zugriff auf Ressourcen vom Server. CORS ist ein auf HTTP-Headern basierender Mechanismus, der es einem Server ermöglicht, die externen Ursprünge (Domain, Protokoll oder Port) anzugeben, von denen ein Browser das Laden von Ressourcen erlauben 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 derselben Quelle 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 später in der Konfiguration oder in der Konfiguration eines Verzeichnisses unterhalb der gesetzten Einstellung nicht überschreiben, wird jede Anfrage von externen Servern angenommen, was wahrscheinlich nicht Ihren Wünschen entspricht.
Eine Alternative besteht darin, explizit anzugeben, welche Domains Zugriff auf den Inhalt Ihrer Website haben. Im unten stehenden Beispiel beschränken wir den Zugriff auf ein Unterdomäne unserer Hauptseite (example.com). Dies ist sicherer und entspricht vermutlich eher Ihrer Absicht.
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "subdomain.example.com"
</IfModule>
Cross-Origin-Bilder
Wie im Chromium-Blog berichtet und in Erlauben der Cross-Origin-Verwendung von Bildern und Canvas dokumentiert, können das zu Fingerprinting-Angriffen führen.
Um die Möglichkeit dieser Angriffe zu mindern, sollten Sie das crossorigin-Attribut in den von Ihnen angeforderten Bildern verwenden und den unten stehenden 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>
Google Chromes Anleitung zur Problembehebung bei Google Fonts besagt, dass, obwohl Google Fonts den CORS-Header bei jeder Antwort senden könnte, einige Proxy-Server ihn entfernen, bevor der Browser ihn nutzen 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 Ressourcen-Timing-Spezifikation definiert eine Schnittstelle für Webanwendungen, um auf vollständige Timing-Informationen für Ressourcen in einem Dokument zuzugreifen.
Der Timing-Allow-Origin-Antwort-Header spezifiziert Ursprünge, die die Werte von Attributen sehen dürfen, die über Funktionen der Ressourcentiming-API abgerufen werden, und die andernfalls aufgrund von Cross-Origin-Beschränkungen als Null gemeldet werden würden.
Wenn eine Ressource nicht mit einem Timing-Allow-Origin bedient wird oder wenn der Header nach der Anfrage den Ursprung nicht einschließt, 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 es Ihnen, benutzerdefinierte Fehlerseiten für Benutzer bereitzustellen, abhängig von der Art des Fehlers, den 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.
Weitere Informationen finden Sie in der ErrorDocument-Direktive in der HTTPD-Dokumentation.
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, /some/dir MultiViews aktiviert ist und /some/dir/foo nicht existiert, dann liest der Server das Verzeichnis und sucht nach Dateien, die mit foo.* benannt sind, und simuliert effektiv eine Typenkarte, die all diese Dateien benennt, indem er ihnen die gleichen Medientypen und Inhaltskodierungen zuweist, die sie hätten, wenn der Client eine von ihnen namentlich angefordert hätte. Anschließend wählt er die beste Übereinstimmung mit den Anforderungen des Clients.
Die Einstellung deaktiviert MultiViews für das Verzeichnis, auf das diese Konfiguration angewendet wird, und verhindert, dass Apache einen 404-Fehler als Ergebnis einer Umschreibung zurückgibt, wenn das Verzeichnis mit demselben Namen nicht existiert.
Options -MultiViews
Medientypen und Zeichencodierungen
Apache verwendet mod_mime, um Inhaltsmetadaten der für eine HTTP-Antwort ausgewählten Inhalte zuzuweisen, indem Muster im URI oder in Dateinamen den Metadatenwerten zugeordnet werden.
Zum Beispiel definieren die Dateierweiterungen von Inhaltsdateien oft den Internet-Medientyp, die Sprache, den Zeichensatz und die Inhaltskodierung des Inhalts. Diese Informationen werden in HTTP-Nachrichten enthalten, die diesen Inhalt enthalten und bei der Inhaltsverhandlung verwendet werden, um Alternativen auszuwählen, sodass die Präferenzen des Benutzers respektiert werden, wenn eine von mehreren möglichen Inhalten ausgewählt werden soll.
Das Ändern 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 ändern (Sprache, Inhaltstyp, Zeichensatz oder Kodierung), müssen Sie möglicherweise die betroffenen Dateien 'anpassen' (das Datum der letzten Änderung aktualisieren), um sicherzustellen, dass alle Besucher die korrigierten Inhaltsheader erhalten.
Ressourcen mit den entsprechenden Medientypen (auch bekannt als MIME-Typen) bereitstellen
Ordnet Medientypen einer oder mehreren Erweiterungen zu, um sicherzustellen, dass die Ressourcen ordnungsgemäß bereitgestellt werden.
Server sollten text/javascript für JavaScript-Ressourcen gemäß der HTML-Spezifikation verwenden.
<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>
Stellen Sie das Standard-Zeichensatz-Attribut ein
Jeder Inhalt im Web hat einen Zeichensatz. Der Großteil des Inhalts ist UTF-8 Unicode.
Verwenden Sie AddDefaultCharset, um alle als text/html oder text/plain gekennzeichneten Ressourcen mit dem UTF-8-Zeichensatz zu versorgen.
<IfModule mod_mime.c>
AddDefaultCharset utf-8
</IfModule>
Stellen Sie den Zeichensatz für bestimmte Medientypen ein
Stellen Sie die folgenden Dateitypen mit dem charset-Parameter auf UTF-8 ein, indem Sie die in mod_mime verfügbare AddCharset-Direktive verwenden.
<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 dynamisch anhand regulärer Ausdrucksregeln zu ändern. Dies ermöglicht es Ihnen, beliebige URLs auf Ihre interne URL-Struktur in beliebiger Weise zuzuordnen.
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: Server-Variablen, Umgebungsvariablen, HTTP-Header, Zeitstempel, externe Datenbankabfragen und verschiedene andere externe Programme oder Handler können genutzt werden, um eine detaillierte URL-Übereinstimmung zu erzielen.
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 Umschreibungsmaschine (dies ist notwendig, damit die
RewriteRule-Direktiven funktionieren) wie in der RewriteEngine-Dokumentation beschrieben. - Aktivieren Sie die
FollowSymLinks-Option, falls diese noch nicht 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 +SymLinksIfOwnerMatcheinfügen. Beachten Sie jedoch den Leistungseinfluss.- Einige Cloud-Hosting-Dienste erfordern, dass Sie
RewriteBasesetzen. - Siehe Rackspace FAQ und die HTTPD-Dokumentation.
- Je nachdem, wie Ihr Server eingerichtet ist, müssen Sie möglicherweise die
RewriteOptions-Direktive verwenden, um einige Optionen für die Umschreibungsmaschine zu aktivieren.
- Einige Cloud-Hosting-Dienste erfordern, dass Sie
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymlinks
# Options +SymLinksIfOwnerMatch
# RewriteBase /
# RewriteOptions <options>
</IfModule>
Erzwungenes HTTPS
Diese Umschreibungsregeln leiten von der unsicheren Version http:// zur sicheren Version https:// der URL weiter, wie in der Apache HTTPD Wiki beschrieben.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>
Wenn Sie cPanel AutoSSL oder die Let's Encrypt-Webroot-Methode verwenden, um Ihre TLS-Zertifikate zu erstellen, wird die Validierung des Zertifikats fehlschlagen, wenn Validierungsanfragen auf HTTPS umgeleitet werden. Aktivieren Sie die benötigten 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 leiten www.example.com zu example.com um.
Sie sollten Inhalte nicht auf 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 kanonische URLs verwenden, um anzugeben, welche URL Suchmaschinen durchsuchen sollen (wenn sie die Funktion unterstützen).
Setzen Sie die Variable %{ENV:PROTO}, 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 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 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 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 kanonische URLs verwenden, um anzugeben, welche URL Suchmaschinen durchsuchen sollen.
Setzen Sie die Variable %{ENV:PROTO}, 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 die Umleitung verfügbar sind. Wenn Ihr TLS-Zertifikat eines der während der Umleitung verwendeten Domains nicht behandeln 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 DENY als Wert, der Browser darüber informiert, 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 sich über die anderen beiden möglichen Werte für den X-Frame-Options-Header informieren: SAMEORIGIN und ALLOW-FROM.
Während Sie den X-Frame-Options-Header für alle Seiten Ihrer Website senden könnten, hat dies den potenziellen Nachteil, dass es sogar jede Einrahmung Ihres Inhalts verbietet (z.B.: wenn Benutzer 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 es einem Benutzer ermöglichen, eine zustandsverändernde Operation durchzuführen (z.B.: Seiten, die Links zum Ein-Klick-Kauf, Kasse oder Bestätigungsseiten für Banküberweisungen enthalten, Seiten, die dauerhafte Konfigurationsänderungen vornehmen).
<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 Inhalteinspritz-Angriffen, indem eine Content Security Policy festgelegt wird, die vertrauenswürdige Inhaltsquellen für Ihre Website erlaubt.
Es gibt keine Richtlinie, die für alle Websites geeignet ist. Das unten stehende Beispiel soll als Leitlinien dienen, die Sie für Ihre Website anpassen können.
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 erwarten.
<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 - was als Fallback für alle Fetch-Direktiven fungiert.- Dies ist praktisch, 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';etc. - Diese Einschränkung bedeutet auch, dass Sie explizit definieren müssen, von welcher(n) Site(s) Ihre Website Ressourcen laden darf. Andernfalls wird sie auf dasselbe Origin wie die Seite, die die Anfrage stellt, beschränkt
- Dies ist praktisch, da Sie nicht alle auf Ihre Website zutreffenden Fetch-Direktiven angeben müssen, zum Beispiel:
-
Verbietet das
<base>-Element auf der Website. Dies soll verhindern, dass Angreifer die Standorte von Ressourcen, die von relativen URLs geladen werden, ändern- Wenn Sie das
<base>-Element verwenden möchten, verwenden Siebase-uri 'self'stattdessen
- Wenn Sie das
-
Erlaubt nur, dass Formulareinreichungen vom aktuellen Ursprung erfolgen mit:
form-action 'self' -
Verhindert, dass alle Websites (einschließlich Ihrer eigenen) Ihre Webseiten innerhalb von z.B.:
<iframe>oder<object>-Elementen 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 es dem Browser, alle Ressourcen, die über HTTP bereitgestellt werden, so zu behandeln, als würden sie sicher über HTTPS geladen, indem die Direktive
upgrade-insecure-requestsgesetzt wirdupgrade-insecure-requestsstellt nicht sicher, dass die oberste Ebene der Navigation über HTTPS erfolgt. Wenn Sie erzwingen möchten, dass die Website selbst über HTTPS geladen wird, müssen Sie denStrict-Transport-Security-Header hinzufügen
-
Schließt den
Content-Security-Policy-Header in alle Antworten ein, die Scripting ausführen können. Dies beinhaltet 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 beteiligt, um Webworker zu betreffen
Verzeichniszugriff
Diese Direktive verhindert den Zugriff auf Verzeichnisse, in denen keine Indexdatei im vom Server konfigurierten Format vorhanden ist, wie index.html oder index.php.
<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 dem Zugriff verborgen, wenn Sie ihren Namen und Ort kennen. Diese Art von Dateien enthält normalerweise Benutzerpräferenzen oder den gespeicherten Zustand eines Dienstprogramms und könnte eher private Orte wie zum Beispiel die .git-oder .svn-Verzeichnisse enthalten.
Das .well-known/-Verzeichnis repräsentiert den Standard (RFC 5785)-Pfadpräfix für "wohlbekannte Orte" (z.B.: /.well-known/manifest.json, /.well-known/keybase.txt), und daher sollte der Zugriff auf dessen sichtbaren Inhalt 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
Den Zugriff auf Sicherungs- und Quelldateien blockieren, die möglicherweise von einigen Texteditoren hinterlassen werden und ein Sicherheitsrisiko darstellen können, wenn jemand Zugriff darauf hat.
Aktualisieren Sie den <FilesMatch>-regulären Ausdruck im folgenden Beispiel, um alle Dateien, die möglicherweise auf Ihrem Produktionsserver landen und sensible Informationen über Ihre Website preisgeben können, einzuschließen. Diese Dateien können Konfigurationsdateien oder Dateien, die Metadaten über das Projekt enthalten, beinhalten, unter anderen.
<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, auch wenn der Server ihn zur sicheren Version der Website umleitet, verbleibt trotzdem ein Fenster der Möglichkeit (die anfängliche HTTP-Verbindung), für einen Angreifer, die Anfrage herabzustufen oder umzuleiten.
Der folgende Header sorgt dafür, 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 die Site so lange wie angegeben über HTTPS bereitgestellt werden kann, wie im max-age-Attribut spezifiziert. 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 die Antwort MIME-sniffing
Einige ältere Browser würden versuchen, den Inhaltstyp einer Ressource zu erraten, selbst wenn er nicht richtig auf der Serverkonfiguration eingerichtet ist. Dies reduziert das Risiko von Drive-by-Download-Angriffen und Cross-Origin-Datenlecks.
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
</IfModule>
Verweiser-Richtlinie
Wir fügen den Referrer-Policy-Header in Antworten für Ressourcen ein, die andere Ressourcen anfordern (oder zu ihnen navigieren) können.
Dies umfasst die häufig genutzten Ressourcentypen: HTML, CSS, XML/SVG, PDF-Dokumente, Skripte und Worker.
Um das Auslaufen von Verweisern vollständig zu verhindern, geben Sie den Wert no-referrer an. Beachten Sie, dass die Wirkung sich negativ auf Analysetools auswirken könnte.
Verwenden Sie Dienstleistungen 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>
TRACE-HTTP-Methode deaktivieren
Die TRACE-Methode, obwohl scheinbar harmlos, kann in einigen Szenarios 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 nun TRACE-Anfragen, die über JavaScript gestellt werden. Es wurden jedoch andere Methoden zur Durchführung von TRACE-Anfragen mit Browsern entdeckt, wie z.B. die Verwendung von Java.
Wenn Sie Zugriff auf die Hauptserver-Konfigurationsdatei haben, verwenden Sie die TraceEnable-Direktive stattdessen.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^TRACE [NC]
RewriteRule .* - [R=405,L]
</IfModule>
Entfernen Sie den X-Powered-By-Antwort-Header
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 Wert und in einigen Fällen kann die von ihm bereitgestellte Information Verwundbarkeiten 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 Sprach-/Framework-Ebene deaktivieren (z.B.: für PHP können Sie dies tun, indem Sie das Folgende in php.ini einstellen).
expose_php = off;
Entfernen Sie die von Apache erzeugte Fußzeile mit Serverinformationen
Verhindern Sie, dass Apache eine nachgestellte Fußzeile mit Informationen über den Server zu von Server generierten Dokumenten hinzufügt (z.B.: Fehlermeldungen, Verzeichnislisten, etc.). Siehe die ServerSignature-Direktive-Dokumentation für weitere Informationen darüber, was die Serversignatur bietet, und die ServerTokens-Direktive für Informationen über die Konfiguration der in der Signatur bereitgestellten Informationen.
ServerSignature Off
Beheben von fehlerhaften AcceptEncoding-Headern
Einige Proxys und Sicherheitssoftware verunstalten oder entfernen den Accept-Encoding-HTTP-Header. Siehe Pushing Beyond Gzipping für eine ausführlichere 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 Hilfe 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 Medientypen zuordnen
Ordnen Sie die folgenden Dateinamenserweiterungen dem angegebenen Codierungstyp zu, indem Sie AddEncoding verwenden, damit Apache die Dateitypen mit dem entsprechenden Content-Encoding-Antwortheader bereitstellen kann (das wird NICHT dazu führen, dass Apache sie komprimiert!). Wenn diese Dateitypen ohne einen geeigneten Content-Encoding-Antwortheader bereitgestellt würden, wüssten Client-Anwendungen (z.B.: Browser) nicht, dass sie die Antwort zuerst dekomprimieren müssten und könnten folglich den Inhalt nicht verstehen.
<IfModule mod_deflate.c>
<IfModule mod_mime.c>
AddEncoding gzip svgz
</IfModule>
</IfModule>
Cache-Ablauf
Stellen Sie Ressourcen mit einem Verfallsdatum in ferner Zukunft bereit, indem Sie das mod_expires-Modul, sowie 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>