codeblick logocodeblick logo small

Digitale Lösungen

30 nützliche .htaccess Snippets um Ihren Internet-Auftritt zu optimieren

Hinweis: Normalerweise ist es ausreichend, die Snippet-Beispiele in Ihre .htaccess Datei zu kopieren. Es können aber auch Fälle auftreten, die noch weitere Änderungen und Anpassungen erfordern. Nutzung auf eigene Gefahr.

WICHTIG: Apache 2.4 bringt einige Änderungen mit sich. Für weitere Informationen, können Sie sich diese Zusammenfassung von heise.de durchlesen.

Erzwinge www. Umleitung

Mit diesem Snippet können Sie das sogenannte "Duplicate Content" (inhaltliches Duplikat) verhindern.

      RewriteEngine on
RewriteCond %{HTTP_HOST} ^ihreseite\.de [NC]
RewriteRule ^(.*)$ http://www.ihreseite.de/$1 [L,R=301,NC]
    

Erzwinge www. Umleitung (Generisch)

Dieses Snippet ist das gleiche wie oben, nur funktioniert es für jede Domain.

      RewriteCond %{HTTP_HOST} !^$ 
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)| 
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
    

Erzwinge HTTPS Umleitung

Mit diesem Snippet können Sie alle Anfragen auf eine sichere Verbindung umleiten.

      RewriteEngine onRewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

# Hinweis: Es ist empfehlenswert, HTTP Strict Transport Security (HSTS) zu aktivieren
# um Man-in-the-Middle Angriffe zu verhindern. 
# https://developer.mozilla.org/en-US/docs/Web/Security/HTTP_strict_transport_security

Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
    

Erzwinge HTTPS Umleitung hinter einem Proxy

Nützlich, wenn ein Proxy vor dem TLS vorgeschalten ist.

      RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    

Erzwinge abschließenden Schrägstrich (Slash)

      RewriteCond %{REQUEST_URI} /+[^\.]+$
RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]
    

Einzelne Seite weiterleiten (301)

      Redirect 301 /alteseite.html http://www.ihreseite.de/neueseite.html
Redirect 301 /alteseite2.html http://www.ihreseite.de/ordner/
    

Alias für einzelne Ordner erstellen

      RewriteEngine On
RewriteRule ^alter-ordner/(.*) ziel-ordner/$1
    

Alias für Skripte erstellen

      RewriteEngine On RewriteRule ^$ index.fcgi/ [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.fcgi/$1 [QSA,L]
    

Komplette Webseite umleiten (301)

Mit dieser Methode bleiben die Links intakt. Zum Beispiel www.alteseite.de/foo/bar/link.html wird zu www.neueseite.de/foo/bar/link.html. Das ist sehr hilfreich, wenn Sie Ihre Seite "nur" auf eine neue Domain umziehen.

      Redirect 301 / http://neueseite.de/
    

Alias für "saubere" URLs erstellen

Mit diesem Snippet können Sie "saubere URLs" nutzen, ohne eine PHP Erweiterung, z.B. beispiel.de/users statt beispiel.de/users.php.

      RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^([^.]+)$ $1.php [NC,L]
    

Kompletten Zugriff verweigern

Aber Vorsicht, mit diesem Snippet können Sie auf Ihren Content auch nicht mehr zugreifen!

      ## Apache 2.2 
Deny from all
## Apache 2.4 
Require all denied
    

Kompletten Zugriff verweigern (bis auf Ersteller)

xxx.xxx.xxx.xxx ist Ihre IP. Wenn Sie die letzten 3 Ziffern mit z.B. 0/12 ersetzen, beschreiben Sie damit einen Bereich von IPs in dem selben Netzwerk. Das spart Zeit, die erlaubten IPs als einzelne Listeneinträge zu definieren.

      ## 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
    

Kompletten Zugriff erlauben (bis auf Spammer)

      ## Apache 2.2 
Order deny,allow
Allow from all
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
    

Zugriff auf versteckte Dateien und Ordnern verweigern

Versteckte Dateien und Ordner sollten (fast alle Dateien mit . am Anfang) abgesichert werden.
Zum Beispiel: .htaccess, .htpasswd, .git usw.

      RewriteCond %{SCRIPT_FILENAME} -d [OR] 
RewriteCond %{SCRIPT_FILENAME} -f RewriteRule "(^|/)\." - [F]

RedirectMatch 404 /\..*$
    

Zugriff auf Backup und Quelldateien verweigern

Diese Dateien können manchnmal von Text- bzw. HTML-Editoren übrig und können im Browser aufgerufen werden. Sie können ein Sicherheitsrisiko darstellen, wenn jemand Zugriff auf diese Dateien hat.

      <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>
    

Directory Browsing deaktivieren

      Options All -Indexes
    

Image Hotlinking deaktivieren

      RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ - [NC,F,L]
    

Verzeichnis mit einem Passwort schützen

Zuerst muss eine .htpasswd Datei erstellt werden, z.B.:

      htpasswd -c /var/www/ordner/.htpasswd foo
    

Somit kann man die Authentifizierung in der .htaccess nutzen:

      AuthType Basic
AuthName "Geschützter Bereich"
AuthUserFile /var/www/ordner/.htpasswd 
Require valid-user
    

Einzelne oder mehrere Dateien mit Passwort schützen

      AuthType Basic 
AuthName "Geschützte Datei" 
AuthUserFile /var/www/ordner/.htpasswd
<Files "datei.txt">
Require valid-user 
</Files>
<FilesMatch ^((eins|zwei|drei)-dateien?\.o)$> Require valid-user </FilesMatch>
    

Textdateien komprimieren

      <IfModule mod_deflate.c>
# Force compression for mangled headers.
# http://developer.yahoo.com/blogs/ydn/posts/2010/12/pushing-beyond-gzipping    

<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>

# Compress all output labeled with one of the following MIME-types
# (for Apache versions below 2.3.7, you don't need to enable `mod_filter`
#  and can remove the `` and `` lines
#  as `AddOutputFilterByType` is still in the core directives).

<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 setzen

Mit Expire Headers kann man dem Browser mitteilen, ob er eine spezielle Datei vom Server oder aus dem lokalen Cache geladen werden soll. Es ist empfehlenswert, statische Inhalte mit einem Datum weit in der Zukunft zu versehen.

      <IfModule mod_expires.c>

ExpiresActive on    
ExpiresDefault "access plus 1 month"  

# CSS    
ExpiresByType text/css "access plus 1 year"  

# Data interchange    
ExpiresByType application/json "access plus 0 seconds"    
ExpiresByType application/xml "access plus 0 seconds"    
ExpiresByType text/xml "access plus 0 seconds"  

# Favicon (cannot be renamed!)    
ExpiresByType image/x-icon "access plus 1 week"  
# HTML components (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"  

# Manifest files    
ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds"    
ExpiresByType text/cache-manifest "access plus 0 seconds"  

# Media
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 fonts    
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>
    

eTags Off abschalten

Indem Sie ETag header entfernen, deaktivieren Sie den Cache der Browser, so das diese gezwungen sind Ihren Cache-Kontrolle und Expires headers zu verwenden.

      <IfModule mod_headers.c>    
Header unset ETag 
</IfModule> 
FileETag None
    

PHP Variablen setzen

      php_value [Schlüssel] [Wert] 
# Zum Beispiel: 
php_value upload_max_filesize 50M 
php_value max_execution_time 240
    

Individuelle Fehlerseiten

      ErrorDocument 500 "Houston, wir haben ein Problem."
ErrorDocument 401 http://error.ihreseite.de/fehler.html 
ErrorDocument 404 /errors/fehler.html
    

Download erzwingen

Manchmal möchte man den Browser zum Download der Datei zwingen, statt den Inhalt anzuzeigen. Das folgende Snippet hilft dabei:

      <Files *.md>   
ForceType application/octet-stream    
Header set Content-Disposition attachment 
</Files>
    

Download verhindern

Andersrum, kann es auch den Fall geben, bei dem man einen Download vermeiden möchte und nur den Inhalt anzeigen will.

      <FilesMatch "\.(tex|log|aux)$">    
Header set Content-Type text/plain 
</FilesMatch>
    

Cross-Domain Fonts erlauben

Webfonts die per CDN eingebunden werden, können in Chrome, Firefox oder IE wegen CORS nicht richtig angezeigt werden. Das folgende Snippet schafft hier Abhilfe:

      <IfModule mod_headers.c>   
 <FilesMatch "\.(eot|otf|ttc|ttf|woff|woff2)$">        
Header set Access-Control-Allow-Origin "*"    
</FilesMatch> 
</IfModule>
    

Automatisch UTF-8 enkodieren

      # Use UTF-8 encoding for anything served text/plain or text/html 

AddDefaultCharset utf-8 
# Force UTF-8 for a number of file formats 
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml
    

Auf eine andere PHP-Version umschalten

Wenn Sie sich auf einem Share-Host befinden, sind die Chancen groß, dass Ihnen mehr als eine PHP-Verison zur Verfügung steht und manchmal möchte man eben eine bestimmte PHP-Version für seine Website. Zum Beispiel Laravel benötigt PHP >= 5.4. Das folgende Snippet hilft Ihnen die PHP Version umzuschalten:

      AddHandler application/x-httpd-php55 .php 
# Alternatively, you can use 
AddType AddType application/x-httpd-php55 .php