Spaces. Smartes Cloud Hosting für anspruchsvolle Webprojekte. Loslegen und Spaces testen. Von Mittwald.
Andreas Hecht 23. Februar 2016

Mehr Speed, mehr Sicherheit: die optimale .htaccess

Die optimale .htaccess Datei für mehr Speed und Sicherheit

Die Webserver-Konfigurationsdatei .htac­cess ist eine der wich­tigs­ten Dateien dei­ner Website-Installation. Viel kann die­se oft­mals noch unter­schätz­te Datei leis­ten. Sie kann zu einem wah­ren Performance-Schub einer Website eben­so bei­tra­gen, wie zu erhöh­ter Sicherheit. Beides ist in der heu­ti­gen Zeit wich­tig. Die Ladegeschwindigkeit ist bereits seit län­ge­rem ein Rankingfaktor für die Position der eige­nen Website in den Google-Suchergebnissen. Zudem wer­den immer wie­der WordPress-Websites gehackt, weil kein Augenmerk auf die Sicherheit der Website gelegt wird. In die­sem Artikel stel­le ich mei­ne eige­ne .htac­cess-Datei vor, die ich im Laufe der Zeit immer wei­ter ver­fei­nert und opti­miert habe.

Die optimale .htaccess Datei für mehr Speed und Sicherheit

Eine optimale .htaccess Datei

Eine opti­ma­le .htac­cess-Datei wird es nie­mals fer­tig kon­fi­gu­riert geben kön­nen, da sich vie­le Punkte indi­vi­du­ell auf die eige­ne Website bezie­hen wer­den. Auch die von mir vor­ge­stell­te Datei ist nur ein gro­ßer Teil des­sen, was bei mir aktiv ist. Einiges muss noch auf per­sön­li­che Bedürfnisse ange­passt wer­den, doch mit dem fol­gen­den Code hat man bereits sehr viel erreicht. Vor allem ist eine opti­ma­le Grundlage für eine wirk­lich schnel­le Website geschaf­fen wor­den. Nicht ver­ges­sen habe ich dabei den Bereich Sicherheit, der sich zum Teil auf WordPress bezieht.

Die kom­plet­te Datei kann bei GitHub her­un­ter­ge­la­den wer­den.

Teil 1: Browser-Caching

Im Abschnitt Caching wur­de an alles gedacht, auch an das Zwischenspeichern der belieb­ten Webfonts, die dann aller­dings auf dem eige­nen Server lie­gen soll­ten. In der Sektion für die Bildformate fin­det das neue Grafik-Format WebP Berücksichtigung. Dateien, die sich im Allgemeinen eher sel­ten ändern, zum Beispiel JavaScripts, bekom­men einen weit in der Zukunft defi­nier­ten Cache-Header. Feeds hin­ge­gen wer­den nur eine Stunde gecached, fast alle ande­ren Dateien hin­ge­gen einen Monat. Zu beach­ten ist, dass in der Datei sta­ti­sche HTML-Seiten für eine schnel­le­re Auslieferung für eine Stunde (3.600 Sekunden) in den Speicher beför­dert wer­den. Wer das nicht möch­te, setzt statt­des­sen ein access plus 0 seconds ein.

Der ETag-Header wird durch die .htac­cess deak­ti­viert, da ein Last-Modified-Header gesen­det wird. Zudem ist die ETag-Technologie bekannt als lang­sam, daher nut­zen wir sie nicht. Wichtig zu erwäh­nen ist, dass ein keep-ali­ve-Header gesen­det wird. Das erlaubt dem Browser das gleich­zei­ti­ge Laden meh­re­rer Dateien und sorgt für einen wei­te­ren Performance-Schub.

Bitte beach­ten: Da auch das CSS zwi­schen­ge­spei­chert wird, soll­te man, wenn man öfter etwas dar­an ändert, ent­we­der die Datei nach einer Änderung umbe­nen­nen, oder eine Versionierung imple­men­tie­ren. Ich bevor­zu­ge die zwei­te Lösung, die ein Teil eines zukünf­ti­gen Artikels sein wird.

Ein Klick öff­net die kom­plet­te Datei bei GitHub
htaccess-caching

Teil 2: Die komprimierte Auslieferung der Dateien

Viele Vorschläge für .htac­cess Dateien, die im Netz zu fin­den sind, sind nur rudi­men­tär und unvoll­stän­dig. Alle denk­ba­ren und wich­ti­gen Datei-Formate wer­den durch mei­ne .htac­cess kom­pri­miert aus­ge­lie­fert, damit ein wirk­li­cher Geschwindigkeitsvorteil ent­steht.

Ein Klick öff­net die kom­plet­te Datei bei GitHub
Kompression

Teil 3: Allgemeine Sicherheitseinstellungen

Der Grand­sei­g­neur des Webdesigns – Jeff Starr von Perishable Press – feilt bereits seit Jahren an sei­ner Blockliste für die .htac­cess. Die neu­es­te Version sei­ner Firewall, die 6G, ist ein Manifest der Sicherheit und wird ger­ne durch eini­ge WordPress-Security-Plugins kopiert, weil sie so effek­tiv ist. Sie schützt unter ande­rem vor Cross-Site-Scripting und Schadcode-Implementierung über die Erweiterungen von URLs. Hackversuche wer­den trotz des mini­ma­len Codes wir­kungs­voll unter­bun­den und der Code arbei­tet sehr effek­tiv.

Ein Klick öff­net die kom­plet­te Datei bei GitHub
6G-Firewall-Blacklist

Teil 4: Wichtige Sicherheitseinstellungen für WordPress

Die all­ge­mei­ne Beliebtheit des Content-Management-Systems WordPress ist lei­der der Grund dafür, dass es sich immer öfter den Hackversuchen bös­wil­li­ger Mitmenschen aus­ge­setzt sieht. Mit eini­gen Zeilen Code in der .htac­cess kann man dem vor­beu­gen. Kommt dann noch eine Absicherung des Administrator-Zugangs der Website hin­zu, kann man die Site als sicher anse­hen, wenn man die Basics wie das recht­zei­ti­ge Update von WordPress, Theme und Plugins beherrscht.

Wie man den Admin-Zugang einer WordPress-Website per .htac­cess und .htpasswd wir­kungs­voll absi­chert, haben wir bereits beschrie­ben. Ebenfalls wird die poten­zi­ell unsi­che­re XML-RPC-Schnittstelle von WordPress mit die­sem Code völ­lig abge­schal­tet. Wer die Schnittstelle nut­zen möch­te, weil er zum Beispiel mit der neu­en WordPress-Desktop-App arbei­tet, muss den Bereich des Codes aus­kom­men­tie­ren. Das geschieht mit einer vor­ge­setz­ten Raute (#) pro Code-Zeile. Die Absicherung des Adminbereichs ist bereits vor­be­rei­tet, wenn du die­se Form der Sicherheit nicht nut­zen möch­test, dann kom­men­tie­re die­sen Bereich aus.

Ein Klick öff­net die kom­plet­te Datei bei GitHub
Einstellungen in der htaccess für die Sicherheit von WordPress

Download der kompletten .htaccess Datei

Die kom­plet­te .htac­cess Datei kann bei GitHub her­un­ter­ge­la­den wer­den.

Fazit

Mit die­ser .htac­cess Datei sind wir schon ziem­lich nahe am Optimum. Die Datei ist eine her­vor­ra­gen­de Grundlage, in der nur noch eini­ge klei­ne, sei­ten­spe­zi­fi­sche Details ergänzt wer­den müs­sen (ver­mut­lich). Mir und mei­ner Website leis­tet die­se Datei sehr gute Dienste, und, ich hof­fe stark, dir auch. Die Datei ist zudem so auf­ge­baut, dass es kei­ne ner­vi­gen Probleme mehr bei Google Page Speed Insights gibt. Falls jemand von euch der Meinung ist, es gäbe da noch Verbesserungsbedarf, dann schrei­be er/sie bit­te einen Kommentar. Auch ich ler­ne ger­ne noch dazu :-)

Links zum Thema:

(dpe)

Andreas Hecht

Andreas Hecht

entwickelt WordPress-Websites und bietet dir einen Website Sicherheit Service und einen Performance Service für deine Website. Außerdem ist er Spezialist für Onpage SEO und bringt Deine Website in die Top-Suchergebnisse von Google. Auf seinem Blog schreibt er über WordPress, SEO und Content SEO.

34 Kommentare

  1. Sehr Cool, vie­len Dank!

    #Full Path Disclosure abschal­ten – unter­drueckt die Anzeige des voll­sta­en­di­gen Fehlerpfads
    php_flag display_errors Off

    Erzeugt bei mir einen Server Internal Error, nut­ze 1und1 WordPress

    • Hallo Sven,

      Full Path Disclosure scheint nicht bei jedem Hoster zu funk­tio­nie­ren. Lösche den Teil ein­fach her­aus.

      • done, hat nur eine wei­le gedau­ert bis ich es gefun­den habe xD.
        Ein klei­nes Problem habe ich noch, die .htpasswd erstel­lung hat wun­der­bar geklappt.
        aller­dings ist die zusätz­li­che abfra­ge ein wenig wun­der­lich.
        Es kommt nur noch die Zusatzabfrage und dann bleibt der Browser weiß, und auch nur wenn ich wp-login.php ein­ge­be ohne php kommt nicht mal die abfra­ge.
        Wenn ich die Seite dann neu lade bin ich bereits Eingeloggt *con­fu­sed*
        Dazu viel­leicht noch eine Idee ?
        Beste Grüße
        Sven

      • Hi Sven,

        dann stimmt irgend­et­was mit der Konfiguration der Dateien oder Deinem WP nicht.

  2. Hallo,

    wenn mei­ne WordPressinstallation in einem Unterverzeichnis liegt, z.B. /wp, lege ich die .htac­cess dann dort rein oder hier hin: / (und dann zusätz­lich auch noch­mal in /wp?)

    Ich habe noch eine ande­re Software instal­liert, z.B. /forumetc und fra­ge hier nach, ob die .htac­cess Probleme macht, wenn sie im / liegt.

    Und kann ich irgend­wie tes­ten, ob die .htac­cess auch funk­tio­niert?

    lie­ben dank euch

    • Hallo Marc,

      die .htac­cess muss immer in das Rootverzeichnis der WordPress-Installation. Also dahin, wo die Ordner wp-con­tent, wp-admin, wp-inclu­des lie­gen. Wenn eine Ebene höher dann ein wei­te­rer Ordner /forumtec mit einer ande­ren .htac­cess liegt, hat das kei­ne Auswirkungen.

  3. Hallo Andreas,

    bes­ten Dank für die aus­führ­li­che Anleitung. Ich kann mich dem Tenor nur anschlie­ßen. Insbesondere durch Komprimierung habe ich bereits sehr gute Ergebnisse erreicht. Großartig fin­de ich die Tipps zur Sicherheit, da ich es bis­lang ver­mie­den habe, irgend­wel­che omi­nö­sen Plugins hier­für zu instal­lie­ren.

    Bei der Aufstellung der “com­mon files” fehlt das Format .svg

    LG Arne

  4. Erst ein­mal vie­len Dank für die­se super Hilfe! Wenn ich alles so ein­bin­de (inklu­si­ve den Verbesserungen von Daniel) dann bekom­me ich auf mei­nem Startseiten-Verzeichnis den Fehler „Forbidden 403 Error, Apache Server at (www.meinedomain.de) Port 80“.

    Ich muss­te heu­te auch in mei­nem Router (Easybox 803A) Ports frei­ge­ben für die PS4 Verbindung. Darunter war auch der Port 80. Hängt das zufäl­lig mit­ein­an­der zusam­men?

    Über eine Antwort wäre ich sehr dank­bar! =)

    (Sorry für den Doppelpost – hat­te die Email-Benachrichtigung nicht ange­hakt. Erster Post kann gelöscht wer­den.)

  5. Vielen Dank für die­sen tol­len Tipp!
    GoogleSpeedCheck von 72 auf !!!92!!!
    Habe nur ein Problem: Meine Site ist über https erreich­bar. Bin ich auf der Site und gebe http ein, dann wird die auch unter http gela­den und kli­cke ich auf Aktualisieren, wird die Seite mit http und ohne Bilder gela­den.
    Wie erzwin­ge ich https?

  6. Hallo, vie­len Dank für die Datei!

    Funktioniert bei mir bis auf ein klei­nes Problem sehr gut.

    Vor allem beim “Chrome” Browser ist mir auf­ge­fal­len, dass aktua­li­sier­te Seiten tage­lang nur aus dem Browsercache ange­zeigt wer­den. Nur nach manu­el­lem neu­la­den wird die Seite aktua­li­siert. Das ist für Seiten die täg­lich geän­dert wer­den natür­lich nicht sinn­voll.
    In der Firebugkonsole ist mir auf­ge­fal­len, dass bei “Last-Modified” als Datum “Thu, 01 Jan 1970 00:00:00 GMT” steht.
    Gibt es eine Lösung mit der das rich­ti­ge Änderungsdatum aus­ge­le­sen und vom Browser für die Seitenanzeige genutzt wird?

    Als Laie fin­de ich kei­ne Lösung, und ich weiss auch nicht, ob es mit der .htac­cess Datei zusam­men­hängt oder ande­re Gründe hat.

    Für Tipps wäre ich dank­bar.

    Mit freund­li­chen Grüßen
    Eugen

  7. Hallo,

    ich bin rela­ti­ver WordPress Anfänger und tech­nisch nicht wirk­lich ver­siert :-). Deshalb mei­ne Fragen:
    1. Kann ich wirk­lich eins zu eins den Code dei­ner htac­cess kopie­ren und mei­ne aktu­el­le Datei damit erset­zen und alles funk­tio­niert sofort ein­wand­frei? Oder ist das als Anfänger even­tu­ell zu gefähr­lich?
    2. Kommt sich die­se htac­cess mit irgend­ei­nem Cache Plugin in die Quere? (WP Rocket, Super Cache) oder kann man pro­blem­los z.B. neben WP Rocket die­se htac­cess Datei benut­zen?
    3. Würde mir die­se htac­cess im Punkto Pagespeed über­haupt noch­mal einen Schub nach vor­ne brin­gen, wenn ich bereits ein Caching Plugin benut­ze?

    Gruß
    Julian

    • Du musst in Zeile 301 den Pfad zur Passwortdatei ein­ge­ben und in Zeile 311 Deine Domain.
      Sichere Diene Site und Deine Datenbank, dann pro­bie­re die htac­cess ein­fach aus. Bei mir hat sie mich bei GoogleSpeedCheck von 72 auf 92 gebracht.

  8. Ein Fehler ist mir auf­ge­fal­len, Zeile 137:
    Header append Vary User-Agent env=!dont-vary

    Da soll­te bes­ser so aus­se­hen:

    Header append Vary User-Agent env=!dont-vary

    Außerdem hab ich beim Rewrite in Zeile 311 nicht nur mei­ne Domain ein­ge­setzt, son­dern aus https:// auch https?:// gemacht, damit die Seite auch ohne SSL funk­tio­niert (je nach Bedarf soll­te man hier prü­fen, was Sinn macht – wenn https immer ver­füg­bar ist, macht es natür­lich Sinn, das auch zu erzwin­gen).

    Zudem hab ich es mir für Apache 2.4 und die neu­en Zugriffsbeschränkungen ange­passt. Das geht in den -Direktiven jeweils, indem
    Order Deny,Allow
    Deny from all
    ersetzt wird durch
    Require all denied
    (SatisfyAll ent­fällt, wo es vor­her vor­han­den war).

    Etwas läs­ti­ger dage­gen ist es mit den Firewall-Regeln, da ja die bei­den letz­ten – 6G:[USER AGENTS] und 6G:[BAD IPS] – bei­de jeweils Einschränkungen ent­hal­ten. Mehrere Requires inner­halb des­sel­ben Gültigkeitsbereichs füh­ren aber lei­der dazu, dass impli­zit ein außen her­um gestellt wird, so dass es bereits genügt, nur eine der bei­den Regeln zu bestehen (was im Falle der Bad IPs fast immer der Fall ist). Daher muss man bei­de in einem zusam­men­fas­sen:

    # 6G:[USER AGENTS]

    SetEnvIfNoCase User-Agent ([a-z0-9]{2000}) bad_bot
    SetEnvIfNoCase User-Agent (archive.org|binlar|casper|checkpriv|choppy|clshttp|cmsworld|diavol|dotbot|extract|feedfinder|flicky|g00g1e|harvest|heritrix|httrack|kmccrew|loader|miner|nikto|nutch|planetwork|postrank|purebot|pycurl|python|seekerspider|siclab|skygrid|sqlmap|sucker|turnit|vikspider|winhttp|xxxyy|youda|zmeu|zune) bad_bot

    Require not env bad_bot

    # 6G:[BAD IPS]

    # uncomment/edit/repeat next line to block IPs
    # Require not ip 123.456.789

    Require all gran­ted

    Zu guter Letzt: Nicht ange­passt habe ich den Schutz des Admin-Bereichs, das dürf­te aber ver­mut­lich ohne Anpassung wei­ter­hin funk­tio­nie­ren (auch ohne mod_access_compat).

    • Sorry, da alles in HTML-Tags auto­ma­tisch raus­ge­fil­tert wird, macht mei­ne Antwort so wenig Sinn…
      Hab mei­ne ange­pass­te Datei nun hier hoch­ge­la­den:
      https://gist.github.com/anonymous/d1afc3513997233c168b

      Zeile 137 ist bei mir 137–139, d.h. ich hab die Bedingung außen her­um ein­ge­fügt.
      Die ange­pass­ten 6G-Regeln fin­den sich ab Zeile 218.
      Die ange­pass­ten Zugriffsbeschränkungen inner­halb der Files-Direktiven (deny auf ver­schie­de­ne Dateien) sind ent­spre­chend auch drin.

  9. Netter Artikel – lei­der nicht zu Ende geführt.
    Eine Verlinkung auf die Datei hät­te so wohl auch genügt.. :(.
    Ich hät­te mir da lie­ber genaue­re Erklärungen gewünscht, Zeile für Zeile.
    Manche Sachen erkennt man ja auf Anhieb, aber bevor ich blind links “irgend­ei­ne” htac­cess akti­vie­re,
    wür­de ich doch ger­ne wis­sen was die ein­zel­nen RegEx Matches z.B. wirk­lich matches – ohne dass ich und ande­re jetzt jeder ein­zeln die Zeilen nach­for­schen.

  10. Hi, erst­mal dan­ke das du die­se super arbeit mit uns teilst ;-)

    Ich muss­te fol­gen­de Einstellung deak­ti­vie­ren das die Webseite rich­tig dar­ge­stellt wird:

    # 6G:[REQUEST STRINGS]

    RedirectMatch 403 (?i)([a-z0-9]{2000})
    RedirectMatch 403 (?i)(https?|ftp|php):/
    RedirectMatch 403 (?i)(base64_encode)(.*)(\()
    RedirectMatch 403 (?i)(=\\\’|=\\%27|/\\\’/?)\.
    RedirectMatch 403 (?i)/(\$(\&)?|\*|\”|\.|,|&|&?)/?$
    RedirectMatch 403 (?i)(\{0\}|\(/\(|\.\.\.|\+\+\+|\\\”\\\”)
    # RedirectMatch 403 (?i)(~|‘||:|;|,|%|\\|\s|\{|\}|\[|\]|\|) <—

  11. Hallo,
    ist die­se .htac­cess für alle Webseiten nutz­bar oder ist die­se hier spe­zi­ell auf WordPress abge­stimmt?
    Mit freund­li­chen Grüßen
    André Wiedemann

    • Hallo André,

      die Datei kann auch für ande­re Websites genutzt wer­den, den Teil mit WordPress musst du dann löschen. Da die Datei gut kom­men­tiert ist, soll­test du erse­hen kön­nen, was für WP ist und was nicht.

  12. Schöne Zusammenstellung. Auch bei rei­nen HTML-Projekten stel­len­wei­se sehr nütz­lich.

  13. Hallo Andreas,
    lei­der habe ich einen Server mit Nginx, da greift die nor­ma­le .htac­cess nicht, und die Einträge müs­sen ver­än­dert wer­den.
    Es wäre toll, wenn es Deine .htac­cess für Nginx ange­passt gäbe…

    • Hi Regina,

      sor­ry, ich habe von Nginx noch kei­ne Ahnung. Allerdings wer­de ich mich in den Bereich noch­mal irgend­wann ein­ar­bei­ten. Ich bit­te also um Geduld.

  14. Einige schö­ne Sache bei, vor allem der Abschnitt von Jeff Starr.
    Stimmt schon, der Server rennt natür­lich wie ver­rückt, wenn man das alles noch ein­mal aus der .htac­cess raus und in die vHost con­fig ein­trägt. Aber das ist bei dem gan­zen sha­red web­hos­ting Kram nicht mög­lich.

  15. Wer sei­ne Webseite in Bezug auf Sicherheit über­prü­fen möch­te, kann das hier tuen:

    https://securityheaders.io

    Erschreckend wie­vie­le Seiten, gera­de auch bekann­te, Hüstel, abschnei­den. ;-))

    • Danke dir für den Link, den kann­te ich noch nicht. Die Ergebnisse sind aller­dings nicht wirk­lich alle so ganz kor­rekt. Die .htac­cess scheint kei­ner­lei Berücksichtigung zu fin­den…

      • Doch wird sie, ich habe mit der .htac­cess auf eini­gen Seiten rum­ge­spielt und mit https://securityheaders.io gecheckt. Das funk­tio­niert her­vor­ra­gend.

        Sehr gut sind auch die Erklärungen und eigent­lich, wenn man das alles befolgt, in ein paar Minuten geges­sen, wenn man nichts beson­de­res ein­stel­len will/möchte/braucht.

  16. Klasse, die wer­de ich gleich mal ein­bau­en!

  17. Danke für die­se Mega-htac­cess-Datei!
    Es soll­te aber jedem bewusst sein, dass der Apache mit jedem Aufruf die­se Datei parst. Ist es hier nicht bes­ser (sofern man die Möglichkeit hat), die Einstellungen direkt in die Apache-Konfiguration zu schrei­ben?
    Bei einem Test mit den Daten hat mir ModPageSpeed einen Strich durch dir Rechnung gemacht. Sobald es aktiv ist, zer­schießt es das gan­ze Layout. Ich habe jetzt nicht wei­ter nach gese­hen, woll­te nur mal meckern! 8-D

    • Nun, es kann nie scha­den, wenn man eini­ge Einstellungen in die Apache-Konfiguration zu schrei­ben. Da muss aber getes­tet wer­den, was dort läuft und was nicht. Die Firewall wür­de ich in der .htac­cess drin las­sen. Abgesehen davon, dass die vor­ge­stell­te .htac­cess Datei immer noch ein Leichtgewicht ist und daher ruhig jedes­mal auf­ge­ru­fen wer­den kann. Das wird sie bei mir auch. Problematisch im Sinne des Layouts kann eigent­lich nur der Hotlinking-Bereich sein. Wie in mei­nem ers­ten Kommenatar bereits geschrie­ben, muss man die eige­ne Domain dort ein­tra­gen. Dann wer­den auch Bilder ange­zeigt.

  18. Toller Artikel! Hatte schon eini­ge der Snippets in place, aber doch noch Neues in dei­nem Artikel gefun­den – herz­li­chen Dank dafür!

  19. Danke für die­sen Artikel!

  20. Hey Andreas, das ist eine tol­le .htac­cess, eine mei­ner Seiten hat direkt einen Boost von 72 auf 94 Page Speed Score erhal­ten. Allerdings habe ich jetzt das Problem, dass nach dem Refresh sämt­li­che Bilder nicht ange­zeigt wer­den, weisst du da viel­leicht Rat?

    • Danke Dir für die Rückmeldung! Da hat sich ein Fehler ein­ge­schli­chen. Im Bereich Hotlinking ver­bie­ten (der drit­te Block von unten) musst Du Deine Domain ein­tra­gen, es steht noch mei­ne drin. Danach soll­te alles wie­der per­fekt lau­fen! Sorry…

Schreibe einen Kommentar

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