Eine Sammlung nützlicher .htaccess-Ausschnitte, alle an einem Ort.
Haftungsausschluss: Während das Einfügen der Ausschnitte
in eine .htaccess
-Datei sehr zeitsparend ist, gibt es Fälle,
in denen bestimme Veränderungen nötig sein könnten. Die Benutzung der
Ausschnitte erfolgt auf eigene Gefahr.
WICHTIG: Apache 2.4 führt einige Änderungen ein, welche die Konfiguration zerstören könnten, hauptsächlich im Bereich der Zugangskontrolle. Für mehr Informationen sehen Sie sich das “Upgrading”-Dokument und dieses Ticket an.
Wir sammeln hier hauptsächlich nützliche Ausschnitte aus dem Internet (beispielsweise aus Apache Server Configs) an einem Ort. Obwohl wir versuchen, alle Autoren zu erwähnen, ist es möglich, dass einige vergessen wurden. Sollten Sie glauben, dass etwas hiervon Ihre Arbeit ist und Sie erwähnt werden sollten, lassen Sie uns dies wissen oder erstellen Sie einfach eine Pull-Anfrage.
Anmerkung: Es wird vorausgesetzt, dass Sie
mod_rewrite
installiert und aktiviert haben.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Dies funktioniert für jede Domain. Quelle
Es wird noch immer diskutiert, ob www oder nicht-www besser ist, wenn Sie also ein Fan von knappen Domains sind:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|off
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)?(.+)$
RewriteRule ^ %1%3%{REQUEST_URI} [R=301,L]
RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
# Bemerkung: Es wird außerdem empfohlen, HTTP Strict Transport Security (HSTS)
# auf Ihrer HTTPS-Webseite zu aktivieren, um Man-in-the-Middle-Attacken zu vermeiden.
# Siehe https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
Nützlich, wenn Sie einen Proxy vor Ihrem Server haben, der TLS-Termination ausführt.
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]
Redirect 301 /oldpage.html http://www.example.com/newpage.html
Redirect 301 /oldpage2.html http://www.example.com/folder/
RewriteEngine On
RewriteRule ^source-directory/(.*) target-directory/$1
FallbackResource /index.fcgi
In diesem Beispiel ist eine index.fcgi
-Datei in einem
Verzeichnis vorhanden und alle Anfragen in dieses Verzeichnis, die keinem
vorhandenen Datei- oder Verzeichnisnamen zugewiesen werden können, werden
stattdessen an das index.fcgi
-Skript gesendet. Dies ist
nützlich, wenn Sie möchten, dass baz.foo/index.fcgi
(was auch
Anfragen an baz.foo
bearbeitet) von
baz.foo/some/cool/path
aufgerufen wird, während
baz.foo/css/style.css
und ähnliche Dateien weiterhin
funktionieren. Sie können über die Umgebungsvariable
PATH_INFO
, die von Ihrer Skriptingumgebung zur Verfügung
gestellt wird, auf den ursprünglichen Pfad zugreifen.
RewriteEngine On
RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
Dies ist eine weniger effiziente Variante der FallbackResource-Direktive
(da die Verwendung von mod_rewrite
komplexer ist, als einfach
nur die FallbackResource
-Direktive zu nutzen), allerdings ist
sie auch flexibler.
Redirect 301 / http://newsite.com/
Auf diese Art bleiben die Links intakt.
www.oldsite.com/some/crazy/link.html
wird zu
www.newsite.com/some/crazy/link.html
. Dies ist sehr
hilfreich, wenn Sie eine Seite nur zu einer neuen Domain “umziehen”.
Quelle
Dieser Ausschnitt erlaubt Ihnen, “saubere URLs”, also URLs ohne
Dateinamenserweiterung, beispielsweise
example.com/users
anstelle von
example.com/users.php
zu verwenden.
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
## Apache 2.2
Deny from all
## Apache 2.4
# Require all denied
Achtung, dadurch werden alle Benutzer, auch Sie selbst, von der Webseite ausgesperrt.
## Apache 2.2
Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx
## Apache 2.4
# Require all denied
# Require ip xxx.xxx.xxx.xxx
xxx.xxx.xxx.xxx
ist Ihre IP-Adresse. Wenn Sie die letzten
drei Ziffern beispielsweise mit 0/12 ersetzen, geben Sie einen Bereich von
IP-Adressen im selben Netzwerk an. Dadurch müssen Sie nicht alle erlaubten
IP-Adressen aus einem Netzwerk separat auflisten.
Quelle
Natürlich gibt es auch eine umgekehrte Version:
## Apache 2.2
Order deny,allow
Deny from xxx.xxx.xxx.xxx
Deny from xxx.xxx.xxx.xxy
## Apache 2.4
# Require all granted
# Require not ip xxx.xxx.xxx.xxx
# Require not ip xxx.xxx.xxx.xxy
Versteckte Dateien und Verzeichnisse (die, deren Name mit einem Punkt
.
startet) sollen meistens, wenn nicht immer, abgesichert
werden. Zum Beispiel: .htaccess
, .htpasswd
,
.git
, .hg
…
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
Alternativ können Sie auch einen Not Found
-Fehler ausgeben,
damit der Angreifer keinen Hinweis auf die Existenz der Dateien erhält:
RedirectMatch 404 /\..*$
Diese Dateien können von manchen Editoren (wie Vi/Vim) zurückgelassen werden, und stellen ein großes Sicherheitsrisiko dar, wenn diese der Öffentlichkeit preisgegeben werden.
<FilesMatch "(\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp)|~)$">
## Apache 2.2
Order allow,deny
Deny from all
Satisfy All
## Apache 2.4
# Require all denied
</FilesMatch>
Options All -Indexes
RewriteEngine on
# Entfernen Sie die folgende Zeile, wenn Sie auch Anfragen mit leerem Referrer blockieren möchten
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(.+\.)?example.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
# Wenn Sie einen "Blockiert"-Banner anstatt des gehotlinkten Bildes
# anzeigen möchten, ersetzen Sie die obere Regel mit:
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]
Manchmal möchte man Bild-Hotlinking nur für manche Seiten deaktivieren.
RewriteEngine on
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^http(s)?://(.+\.)?badsite2\.com [NC,OR]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
# Wenn Sie einen "Blockiert"-Banner anstatt des gehotlinkten Bildes
# anzeigen möchten, ersetzen Sie die obere Regel mit:
# RewriteRule \.(jpg|jpeg|png|gif|bmp) http://example.com/blocked.png [R,L]
Zuerst müssen Sie irgendwo eine .htpasswd
-Datei erstellen:
Dann können Sie diese zur Authentifizierung benutzen:
AuthType Basic
AuthName "One does not simply"
AuthUserFile /home/fellowship/.htpasswd
Require valid-user
AuthName "One still does not simply"
AuthType Basic
AuthUserFile /home/fellowship/.htpasswd
<Files "one-ring.o">
Require valid-user
</Files>
<FilesMatch ^((one|two|three)-rings?\.o)$>
Require valid-user
</FilesMatch>
Verbietet den Zugriff für alle Benutzer, die von einer bestimmten Domain weitergeleitet wurden. Quelle
RewriteEngine on
# Options +FollowSymlinks
RewriteCond %{HTTP_REFERER} somedomain\.com [NC,OR]
RewriteCond %{HTTP_REFERER} anotherdomain\.com
RewriteRule .* - [F]
Dies schützt die Webseite davor, in einem Frame (z.B. einem iframe) dargestellt zu werden, wobei eine bestimmte URI immer noch in einen Frame eingebettet werden darf.
SetEnvIf Request_URI "/starry-night" allow_framing=true
Header set X-Frame-Options SAMEORIGIN env=!allow_framing
<IfModule mod_deflate.c>
# Kompression für verstümmelte Header erzwingen.
# https://developer.yahoo.com/blogs/ydn/pushing-beyond-gzipping-25601.html
<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>
# Alles mit den folgenden MIME-Typen komprimieren:
# (für Apache-Versionen unter 2.3.7, müssen Sie `mod_filter` nicht aktivieren
# und können die Zeilen `<IfModule mod_filter.c>` und `</IfModule>` entfernen
# da `AddOutputFilterByType` noch immer in den Hauptdirektiven ist).
<IfModule mod_filter.c>
AddOutputFilterByType DEFLATE application/atom+xml \
application/javascript \
application/json \
application/rss+xml \
application/vnd.ms-fontobject \
application/x-font-ttf \
application/x-web-app-manifest+json \
application/xhtml+xml \
application/xml \
font/opentype \
image/svg+xml \
image/x-icon \
text/css \
text/html \
text/plain \
text/x-component \
text/xml
</IfModule>
</IfModule>
Expire headers (Ablauf-Header) teilen dem Browser mit, ob er eine bestimmte Datei vom Server oder aus dem Cache laden soll. Es ist ratsam, das Ablaufdatum von statischen Inhalten weit in die Zukunft zu legen. Wenn Sie die Versionierung nicht durch Dateinamen kontrollieren, ziehen Sie in Betracht, die Cachezeit für Ressourcen wie CSS und JS auf ca. eine Woche zu verringern. Quelle
<IfModule mod_expires.c>
ExpiresActive on
ExpiresDefault "access plus 1 month"
# CSS
ExpiresByType text/css "access plus 1 year"
# Datenaustausch
ExpiresByType application/json "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
# Favicon (kann nicht umbenannt werden!)
ExpiresByType image/x-icon "access plus 1 week"
# HTML-Komponenten (HTCs)
ExpiresByType text/x-component "access plus 1 month"
# HTML
ExpiresByType text/html "access plus 0 seconds"
# JavaScript
ExpiresByType application/javascript "access plus 1 year"
# Manifestdateien
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"
ExpiresByType text/cache-manifest "access plus 0 seconds"
# Medien
ExpiresByType audio/ogg "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/png "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"
# Web-Feeds
ExpiresByType application/atom+xml "access plus 1 hour"
ExpiresByType application/rss+xml "access plus 1 hour"
# Web-Schriftarten
ExpiresByType application/font-woff2 "access plus 1 month"
ExpiresByType application/font-woff "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/x-font-ttf "access plus 1 month"
ExpiresByType font/opentype "access plus 1 month"
ExpiresByType image/svg+xml "access plus 1 month"
</IfModule>
Durch das Entfernen des ETag
-Headers können Sie Caches und
Browser davon abhalten, die Dateien zu validieren, sodass sie von Ihren
Cache-Control
und Expires
-Headern abhängig sind.
Quelle
<IfModule mod_headers.c>
Header unset ETag
</IfModule>
FileETag None
php_value <key> <val>
# Zum Beispiel:
php_value upload_max_filesize 50M
php_value max_execution_time 240
ErrorDocument 500 "Houston, wir haben ein Problem."
ErrorDocument 401 http://error.example.com/mordor.html
ErrorDocument 404 /errors/halflife3.html
Manchmal möchten Sie den Browser dazu zwingen, Inhalte herunterzuladen, anstatt sie nur anzuzeigen.
<Files *.md>
ForceType application/octet-stream
Header set Content-Disposition attachment
</Files>
Es gibt auch ein Yang zu diesem Yin:
Manchmal möchten Sie den Browser dazu zwingen, Inhalte nur anzuzeigen, anstatt sie herunterzuladen.
<FilesMatch "\.(tex|log|aux)$">
Header set Content-Type text/plain
</FilesMatch>
Web-Schriftarten von CDNs funktionieren möglicherweise nicht in Firefox oder IE (siehe CORS). Dieser Ausschnitt löst dieses Problem.
<IfModule mod_headers.c>
<FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">
Header set Access-Control-Allow-Origin "*"
</FilesMatch>
</IfModule>
Häufig ist es wünschenswert, dass Text immer als UTF-8 kodiert wird.
# UTF-8-Kodierung für alles verwenden, was als text/plain oder text/html angeboten wird
AddDefaultCharset utf-8
# UTF-8-Kodierung für bestimmte Dateitypen erzwingen
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
Auf einem von mehreren Personen genutzten Server ist häufig mehr als eine PHP-Version installiert, Sie möchten aber möglicherweise eine bestimmte Version für Ihre Webseite nutzen. Beispielsweise benötigt Laravel PHP >= 5.4. Der folgende Ausschnitt sollte die PHP-Version für Sie wechseln.
AddHandler application/x-httpd-php55 .php
# Alternativ können Sie AddType benutzen
AddType application/x-httpd-php55 .php
Die Kompatibilitätsansicht des IE kann sich darauf auswirken, wie manche Webseiten dargestellt werden. Der folgende Ausschnitt sollte IE dazu zwingen, die Edge Rendering Engine zu benutzen und die Kompatibilitätsansicht zu deaktivieren.
<IfModule mod_headers.c>
BrowserMatch MSIE is-msie
Header set X-UA-Compatible IE=edge env=is-msie
</IfModule>
Wenn
WebP-Bilder
unterstützt werden und ein Bild mit der Dateinamenserweiterung
.webp
mit demselben Namen und am selben Ort wie ein
jpg/png-Bild, gefunden wird, dann wird das WebP-Bild anstelle des
jpg/png-Bildes angezeigt.
RewriteEngine On
RewriteCond %{HTTP_ACCEPT} image/webp
RewriteCond %{DOCUMENT_ROOT}/$1.webp -f
RewriteRule (.+)\.(jpe?g|png)$ $1.webp [T=image/webp,E=accept:1]