.htaccess Erstellen Tutorial + nützliche Codes

Erstellt von Andy Dietrich

4. Oktober 2019

Was ist eine htaccess-Datei?

Bei der .htaccess handelt es sich um eine Konfigurationsdatei, die auf NCSA-kompatiblen Webservern wie Apache liegt. In dieser Datei werden Anweisungen zur Konfiguration für den Server hinterlegt und damit verbundene Regeln festgelegt. Die htaccess-Funktion wird über eine textbasierte Datei realisiert, die in einem einfachen Texteditor geschrieben und bearbeitet werden kann. 

Wozu wird eine htaccess benötigt?

In die .htaccess-Datei können Befehle für die Website eingetragen werden, die beispielsweise regeln, welche Inhalte für welche Seitenbesucher erreichbar sind. Mit den richtigen Einträgen, kann sie einen wahren Performance-Schub geben, ebenso für erhöhte Sicherheit sorgen.

 

.htaccess Datei manuell Erstellen

In der Regel erstellt WordPress spätestens dann eine .htaccess Datei, wenn Änderungen der Permalink-Einstellungen vorgenommen wurden. Je nach Server-Konfiguration kann es jedoch sein, dass keine .htaccess Datei automatisch erstellt wird. Falls sie fehlen sollte, dann kann sie ganz einfach selbst erstellt werden.

Um zu überprüfen ob schon eine .htaccess-Datei vorhanden ist kann in den Einstellungen des FTP-Programms die Anzeige von „versteckten Dateien“ erzwungen werden. Am Beispiel von FileZilla kannst das im Menü unter „Server“ eingestellt werden.

 

Schritt 1: Datei Erstellen

Erstellt eine Datei in einem beliebigen Texteditor und speichert die Datei als aa.htaccess ab. Als Dateityp wählt man „alle Typen“.

Besonders gut eignet sich dafür der Texteditor Notepad++ , da er kein html-Kennzeichnungen speichert und sehr benutzerfreundlich ist. Um zu überprüfen ob die Datei auch korrekt erstellt wurde, klickt man per Rechtsklick auf die Datei und wählt Eigenschaften aus. Als Dateityp sollte HTACCESS-Datei zu sehen sein.

 

Speichern via Alle Dateiendungen (All Types)

Eigenschaften der Datei

 

 

Schritt 2: Backup Erstellen

Es sollte jedem klar sein aber nochmals zu Errinerung: Vor jedem arbeiten an der Website oder am Server immer ein Backup erstellen. In diesem Fall allerdings nur von der .htaccess-Datei (falls vorhanden).

 

Schritt 3: Datei auf den Web-Server hochladen und umbennenen

Die soeben erstellte Datei muss nun ins Root-Verzeichnis der gewünschten Website eingefügt werden. Dies ist welches, in der der sich auch die wp-config.php befindet.

Zum Schluss muss die Datei von aa.htaccess in .htaccess umbenannt werden.

Schritt 4: Rechte zuweisen

Damit WordPress und die genutzten Plugins auch auf die .htaccess Datei zugreifen können, müssen die Rechte zugewiesen werden. Dies geschieht per Rechtsklick auf die Datei im Root-Verzeichnis und der Auswahl des Menüpunktes „Dateiberechtigungen“. Dort muss das Beschreiben der .htaccess zugelassen werden.

.htaccess Codesammlung

ist es am Ende eure Entscheidung welche Codes ihr in eure .htaccess aufnimmt. Zu viele Codes können nämlich genau das Gegenteil bewirken und die Performance verringern. Daher sollte immer abgewogen werden was wirklich benötigt wird.

Standardinhalt für/von WordPress

Der folgende Code wird in der Regel von WordPress selbst angelegt. Falls er nicht vorhanden sein sollte, kann er so übenrommen werden. Hat man eine WordPress Multisite Installation, muss der Code anders aussehen. Mehr Info´s darüber findet man im Codex von WordPress.

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

 

Allgemeine Sicherheitseinstellungen

Jeff Starr von Perishable Press – feilt bereits seit Jahren an seiner Blockliste für die perfekte .htaccess. Die neueste Version seiner Firewall, die 7G, ist eine Meisterleistung und wird durch einige WordPress-Security-Plugins kopiert, da sie so effektiv und open source ist.

# 7G FIREWALL v1.2 20190727
# @ https://perishablepress.com/7g-firewall/
# 7G:[QUERY STRING]
<IfModule mod_rewrite.c>

RewriteCond %{REQUEST_URI} !(7g_log.php) [NC]

RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)(:|%3a)(/|%2f) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)(\*|%2a)(\*|%2a)(/|%2f) [NC,OR]
RewriteCond %{QUERY_STRING} (~|`|<|>|\^|\|\\|0x00|%00|%0d%0a) [NC,OR]
RewriteCond %{QUERY_STRING} (cmd|command)(=|%3d)(chdir|mkdir)(.*)(x20) [NC,OR]
RewriteCond %{QUERY_STRING} (fck|ckfinder|fullclick|ckfinder|fckeditor) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)((wp-)?config)((\.|%2e)inc)?((\.|%2e)php) [NC,OR]
RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumbs?)?)((\.|%2e)php) [NC,OR]
RewriteCond %{QUERY_STRING} (absolute_|base|root_)(dir|path)(=|%3d)(ftp|https?) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127(\.|%2e)0(\.|%2e)0(\.|%2e)1) [NC,OR]
RewriteCond %{QUERY_STRING} (\.|20)(get|the)(_|%5f)(permalink|posts_page_url)(\(|%28) [NC,OR]
RewriteCond %{QUERY_STRING} (s)?(ftp|http|inurl|php)(s)?(:(/|%2f|%u2215)(/|%2f|%u2215)) [NC,OR]
RewriteCond %{QUERY_STRING} (globals|mosconfig([a-z_]{1,22})|request)(=|\[|%[a-z0-9]{0,2}) [NC,OR]
RewriteCond %{QUERY_STRING} ((boot|win)((\.|%2e)ini)|etc(/|%2f)passwd|self(/|%2f)environ) [NC,OR]
RewriteCond %{QUERY_STRING} (((/|%2f){3,3})|((\.|%2e){3,3})|((\.|%2e){2,2})(/|%2f|%u2215)) [NC,OR]
RewriteCond %{QUERY_STRING} (benchmark|char|exec|fopen|function|html)(.*)(\(|%28)(.*)(\)|%29) [NC,OR]
RewriteCond %{QUERY_STRING} (php)([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}) [NC,OR]
RewriteCond %{QUERY_STRING} (e|%65|%45)(v|%76|%56)(a|%61|%31)(l|%6c|%4c)(.*)(\(|%28)(.*)(\)|%29) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)(=|%3d|$&|_mm|cgi(\.|-)|inurl(:|%3a)(/|%2f)|(mod|path)(=|%3d)(\.|%2e)) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3c)(.*)(e|%65|%45)(m|%6d|%4d)(b|%62|%42)(e|%65|%45)(d|%64|%44)(.*)(>|%3e) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3c)(.*)(i|%69|%49)(f|%66|%46)(r|%72|%52)(a|%61|%41)(m|%6d|%4d)(e|%65|%45)(.*)(>|%3e) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3c)(.*)(o|%4f|%6f)(b|%62|%42)(j|%4a|%6a)(e|%65|%45)(c|%63|%43)(t|%74|%54)(.*)(>|%3e) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3c)(.*)(s|%73|%53)(c|%63|%43)(r|%72|%52)(i|%69|%49)(p|%70|%50)(t|%74|%54)(.*)(>|%3e) [NC,OR]
RewriteCond %{QUERY_STRING} (\+|%2b|%20)(d|%64|%44)(e|%65|%45)(l|%6c|%4c)(e|%65|%45)(t|%74|%54)(e|%65|%45)(\+|%2b|%20) [NC,OR]
RewriteCond %{QUERY_STRING} (\+|%2b|%20)(i|%69|%49)(n|%6e|%4e)(s|%73|%53)(e|%65|%45)(r|%72|%52)(t|%74|%54)(\+|%2b|%20) [NC,OR]
RewriteCond %{QUERY_STRING} (\+|%2b|%20)(s|%73|%53)(e|%65|%45)(l|%6c|%4c)(e|%65|%45)(c|%63|%43)(t|%74|%54)(\+|%2b|%20) [NC,OR]
RewriteCond %{QUERY_STRING} (\+|%2b|%20)(u|%75|%55)(p|%70|%50)(d|%64|%44)(a|%61|%41)(t|%74|%54)(e|%65|%45)(\+|%2b|%20) [NC,OR]
RewriteCond %{QUERY_STRING} (\\x00|(\“|%22|\’|%27)?0(\“|%22|\’|%27)?(=|%3d)(\“|%22|\’|%27)?0|cast(\(|%28)0x|or%201(=|%3d)1) [NC,OR]
RewriteCond %{QUERY_STRING} (g|%67|%47)(l|%6c|%4c)(o|%6f|%4f)(b|%62|%42)(a|%61|%41)(l|%6c|%4c)(s|%73|%53)(=|[|%[0-9A-Z]{0,2}) [NC,OR]
RewriteCond %{QUERY_STRING} (_|%5f)(r|%72|%52)(e|%65|%45)(q|%71|%51)(u|%75|%55)(e|%65|%45)(s|%73|%53)(t|%74|%54)(=|[|%[0-9A-Z]{0,2}) [NC,OR]
RewriteCond %{QUERY_STRING} (j|%6a|%4a)(a|%61|%41)(v|%76|%56)(a|%61|%31)(s|%73|%53)(c|%63|%43)(r|%72|%52)(i|%69|%49)(p|%70|%50)(t|%74|%54)(:|%3a)(.*)(;|%3b|\)|%29) [NC,OR]
RewriteCond %{QUERY_STRING} (b|%62|%42)(a|%61|%41)(s|%73|%53)(e|%65|%45)(6|%36)(4|%34)(_|%5f)(e|%65|%45|d|%64|%44)(e|%65|%45|n|%6e|%4e)(c|%63|%43)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(.*)(\()(.*)(\)) [NC,OR]
RewriteCond %{QUERY_STRING} (allow_url_(fopen|include)|auto_prepend_file|blexbot|browsersploit|(c99|php)shell|curltest|disable_functions?|document_root|elastix|encodeuricom|exec|exploit|fclose|fgets|fputs|fsbuff|fsockopen|gethostbyname|grablogin|hmei7|input_file|load_file|null|open_basedir|outfile|passthru|popen|proc_open|quickbrute|remoteview|root_path|safe_mode|shell_exec|site((.){0,2})copier|sux0r|trojan|wget|xertive) [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|\’|\“|\)|%0a|%0d|%22|%27|%3c|%3e|%00)(.*)(/\*|alter|base64|benchmark|cast|char|concat|convert|create|encode|declare|delete|drop|insert|md5|order|request|script|select|set|union|update) [NC,OR]
RewriteCond %{QUERY_STRING} ((\+|%2b)(concat|delete|get|select|union)(\+|%2b)) [NC,OR]
RewriteCond %{QUERY_STRING} (union)(.*)(select)(.*)(\(|%28) [NC,OR]
RewriteCond %{QUERY_STRING} (concat)(.*)(\(|%28) [NC]

RewriteRule .* – [F,L]

# RewriteRule .* /7g_log.php?log [L,NE,E=7G_QUERY_STRING:%1___%2___%3]

</IfModule>

.htaccess gelöscht oder zerschossen?

Sollte es mal vorkommen, das die ht.access gelöscht oder durch irgendein Plugin „kaputt“ gemacht wurde, dann kann die Website mit folgendem Code wieder zum Funktionieren gebracht werden:

# BEGIN WordPress
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

Bild-Hotlinking verbieten

Das sogenannte Hotlinking von Bildern kann zum echten Problem werden. Hierbei laden andere Menschen die Bilder aus ihrer Webseite nicht herunter, um sie dann anschliessend zu verlinken, sondern es wird nur der Pfad zu ihrem Bild angegeben. Dies kann unter Umständen eine Website so stark verlagsamen, dass sie im Ranking verliert. Daher sollte diesers Code in keiner .htaccess fehlen. 

Achtung: Dieser Code sorgt manchmal dafür, dass Bilder in RSS Readern nicht mehr angezeigt werden. Wenn du RSS nicht anbietest oder auf die Bilder verzichten kannst, ist das kein Problem.

# Verhindert Image Hotlinking. Ersetze die letzte URL mit einem Bildlink.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?deinblog.de [NC]
RewriteRule \.(jpg|jpeg|png|gif)$ http://deinbild.jpg [NC,R,L]

Include-Only-Dateien blocken

Auf viele wichtige Datei brauchen selbst wir keinen Zugriff und können daher für Zugriffe gesperrt werden.

Bitte beachten: Für eine WordPress-Multisite-Installation funktioniert der Code nicht.

Achtung: Dieser Code sorgt manchmal dafür, dass Bilder in RSS Readern nicht mehr angezeigt werden. Wenn du RSS nicht anbietest oder auf die Bilder verzichten kannst, ist das kein Problem.

# Block the include-only files.<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ – [F,L]
RewriteRule !^wp-includes/ – [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ – [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php – [F,L]
RewriteRule ^wp-includes/theme-compat/ – [F,L]
</IfModule>

PHP – Fehlermeldungen unterdrücken

Sobald ein PHP Fehlermeldung erzeugt wird, wird damit auch der Dateipfad sichtbar. Mit einem simplen Eintrag in der .htaccess Datei löst man das Problem:

php_flag display_errors Off

Adminbereich nur für bestimmte IP-Adressen sichtbar machen

# wp-admin nur für gewisse IPs freischalten
order deny,allow
deny from all
allow from IPAdresse1
allow from IPAdresse2

Zugriff auf WP-config.php für alle User sperren

# Zugriff auf wp-config unterbinden
<files wp-config.php>
order allow,deny
deny from all
</files>

Bestimmte Nutzer über deren IP-Adresse ausschließen

# Nutzer via IP ausschließen
<Limit GET POST>
order allow,deny
deny from XXX.XXX.XX.X
deny from XXX.XXX.XX.X
allow from all
</Limit>

301-Weiterleitung / Redirect einrichte

# 301 Weiterleitungen einrichten
Redirect 301 /alteseite.html http://neueseite.de/neueurl
Redirect 301 / http://neueseite.de/

Browser Caching aktivieren

Mit diesem Code bekommt der Browser den Befehl sämtliche Inhalte wie Javascripte, Grafiken ect. nicht bei jedem Besuch neu zu laden, sondern bildet eine Art Zwischenspeicher der auf den eigenen Cache zurückgreift. Damit spart man Ladezeit und erhöht die Geschwindigkeit einer Website.

# Browser Caching
ExpiresActive On
ExpiresByType image/jpg „access 1 year“
ExpiresByType image/jpeg „access 1 year“
ExpiresByType image/gif „access 1 year“
ExpiresByType image/png „access 1 year“
ExpiresByType text/css „access 1 month“
ExpiresByType application/pdf „access 1 month“
ExpiresByType text/x-javascript „access 1 month“
ExpiresByType application/x-shockwave-flash „access 1 month“
ExpiresByType image/x-icon „access 1 year“
ExpiresDefault „access 2 days“

Gzip Komprimierung auf Apache aktivieren

Damit auch alle Datein kompremiert und keine Fehler 500 entstehen, sollte „mod_filter“ auf dem Server vorhanden sein. Andernfalls kann es sein, dass die Direktive AddOutputFilterByType nicht richtig funktioniert. Diese Code aktiviert Gzip:

# GZIP Komprimierung aktivieren
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

Mit diesem Code sollte alle Ressourcen kompremiert werden:

# mod_deflate aktivieren
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/vtt 
AddOutputFilterByType DEFLATE text/x-component
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/js
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE application/x-httpd-fastphp
AddOutputFilterByType DEFLATE application/atom+xml 
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/ld+json 
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject 
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/font-woff2
AddOutputFilterByType DEFLATE application/x-font-woff
AddOutputFilterByType DEFLATE application/x-web-app-manifest+json font/woff
AddOutputFilterByType DEFLATE font/woff 
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon 
</IfModule>

Gzip Komprimierung auf NGINX aktivieren

Wenn die Installation auf NGINX läuft, dann sollte folgender Code in der nginx.conf-Datei zu finden sein:

gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_vary on;
gzip_types text/plain text/css text/javascript image/svg+xml image/x-icon application/javascript application/x-javascript;

Vielleicht interessiert dich auch…

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.