WordPress htaccess: perfekt für PageSpeed und Sicherheit [01/2022]

292 Kommentare
Die perfekte .htaccess für WordPress – PageSpeed und Sicherheit

Diese WordPress htaccess ist die perfekte .htaccess für dein WordPress und sorgt für einen enormen Performanceschub und ein hohes Sicherheitslevel. Setze meine über 10 Jahre perfektionierte WordPress .htaccess Datei für dein WordPress-Tuning ein und freue dich über beste Ergebnisse und enorm viel Zuwachs an Sicherheit.

Mehr als zehn Jahre Erfahrung sind in meine perfekte .htaccess Datei eingeflossen und sie wurde von Jahr zu Jahr stets verbessert und überarbeitet. 2018 sind die Bereiche Hotlink Protection und der HTTP Schutz für den Adminbereich dazugekommen.

In 08 / 2019 habe ich die problematische 7G-Firewall auf die 2019er Version 6G zurückgenommen. Die 7G-Firewall läuft nun bei 95% aller Websites ohne Probleme. Zusätzlich kamen in 2019 noch die Bereiche „Blocking the »ReallyLongRequest« Bandit“ und der neue experimentelle Header EXPECT-CT dazu.

Die 7-G Firewall wurde am 07.11.2021 auf Version 1.5 aktualisiert.

Letztes Update der WordPress .htaccess: 10.01.2022

  • Dazugekommen: Aggressives Scannen nach Uploads-relevanten Zielen vereiteln – 27.08.2020
  • Dazugekommen: der Strict Origin When Cross Origin Security Header – 10.08.2020
  • Dazugekommen: Ultimate Hotlink Protection in 2018
  • Dazugekommen: Adminbereich mit HTTP Schutz versehen in 2018
  • Aktualisiert 08 / 2019: 7G Firewall auf 6G Firewall @2019
  • Aktualisiert: Strict Transport Security Header mit korrektem »max-age« Eintrag – Update 25.07.2018
  • Dazugekommen: Referrer-Policy Header am 05.06.2018
  • Dazugekommen: Block Nuisance Requests
  • Dazugekommen in 2019: Der Schutz gegen den »ReallyLongRequest« Bot
  • Dazugekommen in 2019: Der experimentelle Security Header EXPECT-CT
  • Update 02/2020: 6G Firewall auf 7G Firewall aktualisiert
  • Update 05/2021: Cache-Laufzeiten für Grafikformate und Fonts optimiert
  • Update 11/2021: 7G-Firewall auf Version 1.5 aktualisiert
  • Update 01/2022: Security Header „upgrade-insecure-requests“

Du magst dich vielleicht wundern, dass die Datei nicht gerade ein Leichtgewicht ist. Doch das Laden dieser Datei dauert nur einen Wimpernschlag. Der Effekt auf deine Website hingegen ist enorm. Ohne weitere Optimierungen wird dein WordPress schon deutlich schneller werden, weil alle wichtigen Bereiche komprimiert und gecacht werden.

Alle optionalen Elemente sind mit Rauten (#) auskommentiert, zur Nutzung diese bitte entfernen.

Die perfekte .htaccess Datei teilt sich in 14 einzelne Bereiche auf:

  • HTTP zu HTTPS Umleitung
  • CORS aktivieren für bestimmte Dateitypen
  • Block Nuisance Requests (Lästige Anfragen blocken) – aktualisiert 07/2019
  • Dateien komprimieren und cachen
  • Die 7G-Firewall von Jeff Starr gegen die Einschleusung von Schadcode
  • Das 7G Addon gegen das aggressive Scannen von Upload-Dateien
  • Das Blocken von WordPress-Dateien gegen Zugriff von außen
  • Hotlink Protection gegen das Verlinken Deiner Bilder auf anderen Websites – 2018
  • Blocking the »ReallyLongRequest« Bandit – Neu in 2019
  • Das Schützen des Adminbereichs mittels HTTP – 2018
  • Das Blocken des Sicherheitsrisikos XML-RPC
  • Der Referrer Header – 05.06.2018
  • Die HTTP-Security-Header – aktualisiert 10.01.2022
  • Die WordPress Standard-Regeln
Bitte beachten: Wenn Du diese Datei oder Auszüge daraus verwenden möchtest, dann nutze bitte den Download der Datei. Beim Kopieren des Codes aus meinem Code-Highlighter-Plugin schleichen sich ab und an Fehler ein.

Die WordPress htaccess als Zip-Datei zum Download

Falls Du Probleme mit dem Einbau der .htaccess bekommst, die SEO Agentur Hamburg kann diesen Job kostenpflichtig für Dich erledigen.

Die perfekte WordPress htaccess, die einzelnen Bereiche

1 – Garantierte HTTP zu HTTPS Umleitung

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>

Dieser Code sorgt im Gegensatz zu anderen Schnipseln für eine garantierte Weiterleitung aller HTTP-Anfragen auf die HTTPS-Version. In der .htaccess ist dieser Bereich auskommentiert, wenn du den Code nutzen möchtest, entferne die Rauten vor den einzelnen Elementen. Falls es zu Problemen mit diesem Code kommt, existiert bereits irgendwo in Deiner Installation eine Umleitung von HTTP auf HTTPS.

Mehr zum Thema: Garantierte Weiterleitung von HTTP zu HTTPS

2 – CORS aktivieren für bestimmte Dateitypen

Was genau ist CORS?

Cross-Origin Resource Sharing (CORS) ist ein Mechanismus, der Webbrowsern oder auch anderen Webclients Cross-Origin-Requests ermöglicht. … CORS ist ein Kompromiss zugunsten größerer Flexibilität im Internet unter Berücksichtigung möglichst hoher Sicherheitsmaßnahmen.

CORS ist ein wichtiger Beitrag zu einer Sicherheitsstrategie in Verbindung mit einer Content Security Policy. Solltest Du diese Strategie einsetzen, dann ist dieser Teil bereits in meiner Datei enthalten.

<IfModule mod_headers.c>
    <FilesMatch "\.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js|gif|png|jpe?g|svg|svgz|ico|webp)$">
        Header set Access-Control-Allow-Origin "*"
    </FilesMatch>
</IfModule>
Die perfekte .htaccess für WordPress - PageSpeed und Sicherheit

Eine Website umfasst vieles. Eine perfekte .htaccess gehört dazu.

3 – Block Nuisance Requests (lästige Anfragen blocken)

Manche Bots suchen sehr emsig nicht existente Dateien auf Deinem Server / Webhosting und blockieren auf diese Weise die Ressourcen des Hostings. Der böswillige Datenverkehr spamt zudem die Fehlerprotokolle des Servers zu, sodass eigentliche Probleme durch diese Anfragen an nicht existente Dateien kaum mehr gefunden werden.

Auf günstigen Shared-Hostings können diese Anfragen durchaus Deine Website in die Knie zwingen und sehr langsam machen. Daher: gleich blockieren.

# ----------------------------------------------------------------------
# | BLOCK NUISANCE REQUESTS - @Update 2019  
#   https://perishablepress.com/block-nuisance-requests
# ----------------------------------------------------------------------

<IfModule mod_alias.c>
	RedirectMatch 403 (?i)\.php\.suspected
	RedirectMatch 403 (?i)apple-app-site-association
	RedirectMatch 403 (?i)/autodiscover/autodiscover.xml
</IfModule>

4 – Dateien komprimieren und cachen

Update 05/2021 – Die Cache Regeln sind jetzt etwas effizienter.

Dieser Bereich ist der umfassendste. Doch jede einzelne Zeile Code ist für die Performance deiner Website wichtig. Jede Dateiart wird komprimiert an den Browser ausgeliefert und in diesem optimal in den Cache aufgenommen. Auch wenn du Plugins wie zum Beispiel Autoptimize und Cache Enabler einsetzt, muss dieser Abschnitt sein, denn er ergänzt diese Plugins für noch mehr Speed.

Ich bitte zu beachten, dass nur Dateien komprimiert und in den Cache aufgenommen werden können, die sich auf Deinem Server befinden.
# Serve resources with far-future expires headers.
#
# (!) If you don't control versioning with filename-based
# cache busting, you should consider lowering the cache times
# to something like one week.
#
# https://httpd.apache.org/docs/current/mod/mod_expires.html

<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/vnd.geo+json              "access plus 0 seconds"
    ExpiresByType application/xml                       "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 - Behält die Website eine Stunde im Cache, neues wird erst nach Ablauf einer Stunde
  # angezeigt. Wenn nicht gewuenscht, bei 3600 eine Null eintragen
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"
    ExpiresByType application/x-javascript              "access plus 1 year"
    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"

  # Media files
    ExpiresByType audio/ogg                             "access plus 1 year"
    ExpiresByType image/bmp                             "access plus 1 year"
    ExpiresByType image/gif                             "access plus 1 year"
    ExpiresByType image/jpeg                            "access plus 1 year"
    ExpiresByType image/png                             "access plus 1 year"
    ExpiresByType image/svg+xml                         "access plus 1 year"
    ExpiresByType image/webp                            "access plus 1 year"
    ExpiresByType video/mp4                             "access plus 1 year"
    ExpiresByType video/ogg                             "access plus 1 year"
    ExpiresByType video/webm                            "access plus 1 year"

  # Web fonts

    # Embedded OpenType (EOT)
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 year"
    ExpiresByType font/eot                              "access plus 1 year"

    # OpenType
    ExpiresByType font/opentype                         "access plus 1 year"

    # TrueType
    ExpiresByType application/x-font-ttf                "access plus 1 year"

    # Web Open Font Format (WOFF) 1.0
    ExpiresByType application/font-woff                 "access plus 1 year"
    ExpiresByType application/x-font-woff               "access plus 1 year"
    ExpiresByType font/woff                             "access plus 1 year"

    # Web Open Font Format (WOFF) 2.0
    ExpiresByType application/font-woff2                "access plus 1 year"

  # Other
    ExpiresByType text/x-cross-domain-policy            "access plus 1 week"
</IfModule>

<IfModule mod_deflate.c>
# Insert filters / compress text, html, javascript, css, xml:
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 

# Exception: Images
SetEnvIfNoCase REQUEST_URI \.(?:gif|jpg|jpeg|png|svg)$ no-gzip dont-vary

# Drop problematic browsers
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
</IfModule>

#Alternative caching using Apache's "mod_headers", if it's installed.
#Caching of common files - ENABLED
<IfModule mod_headers.c>
<FilesMatch "\.(ico|pdf|flv|swf|js|css|gif|png|jpg|jpeg|txt|woff2|woff)$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>
</IfModule>

<IfModule mod_headers.c>
  <FilesMatch "\.(js|css|xml|gz)$">
    Header append Vary Accept-Encoding
  </FilesMatch>
</IfModule>

# Set Keep Alive Header
<IfModule mod_headers.c>
    Header set Connection keep-alive
</IfModule>

# If your server don't support ETags deactivate with "None" (and remove header)
<IfModule mod_expires.c> 
  <IfModule mod_headers.c> 
    Header unset ETag 
  </IfModule> 
  FileETag None 
</IfModule>

<IfModule mod_headers.c>
<FilesMatch ".(js|css|xml|gz|html|woff|woff2|ttf)$">
Header append Vary: Accept-Encoding
</FilesMatch>
</IfModule>

5 – 7G-Firewall gegen die Einschleusung von Schadcode (Update 10/2021)

Dieser Abschnitt sorgt für echte Sicherheit. Immer wieder weisen Plugins und Themes eklatante Sicherheitslücken auf, durch die man Schadcode in eine Website einschleusen könnte. Diese Firewall schiebt dem einen Riegel vor und blockt die gängigen Methoden der Einschleusung.

Wenn Dich die WordPress Sicherheit interessiert, dann schaue Dir diesen Artikel an: WordPress absichern wie ein Profi.

# ----------------------------------------------------------------------
# | 7G Firewall for Security - Do not change this part @Update 11/2021
# ----------------------------------------------------------------------
# 7G FIREWALL v1.5 20211103
# @ https://perishablepress.com/7g-firewall/
# 7G:[CORE]
ServerSignature Off
Options -Indexes
RewriteEngine On
RewriteBase /
# 7G:[QUERY STRING]
<IfModule mod_rewrite.c>
RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)(:|%3a)(/|%2f) [NC,OR]
RewriteCond %{QUERY_STRING} (order(\s|%20)by(\s|%20)1--) [NC,OR]
RewriteCond %{QUERY_STRING} (/|%2f)(\*|%2a)(\*|%2a)(/|%2f) [NC,OR]
RewriteCond %{QUERY_STRING} (`|<|>|\^|\|\\|0x00|%00|%0d%0a) [NC,OR]
RewriteCond %{QUERY_STRING} (ckfinder|fck|fckeditor|fullclick) [NC,OR]
RewriteCond %{QUERY_STRING} ((.*)header:|(.*)set-cookie:(.*)=) [NC,OR]
RewriteCond %{QUERY_STRING} (cmd|command)(=|%3d)(chdir|mkdir)(.*)(x20) [NC,OR]
RewriteCond %{QUERY_STRING} (globals|mosconfig([a-z_]{1,22})|request)(=|\[) [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} (s)?(ftp|inurl|php)(s)?(:(/|%2f|%u2215)(/|%2f|%u2215)) [NC,OR]
RewriteCond %{QUERY_STRING} (\.|20)(get|the)(_|%5f)(permalink|posts_page_url)(\(|%28) [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]{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} (@copy|\$_(files|get|post)|allow_url_(fopen|include)|auto_prepend_file|blexbot|browsersploit|(c99|php)shell|curl(_exec|test)|disable_functions?|document_root|elastix|encodeuricom|exploit|fclose|fgets|file_put_contents|fputs|fsbuff|fsockopen|gethostbyname|grablogin|hmei7|input_file|null|open_basedir|outfile|passthru|phpinfo|popen|proc_open|quickbrute|remoteview|root_path|safe_mode|shell_exec|site((.){0,2})copier|sux0r|trojan|user_func_array|wget|xertive) [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|\'|\"|\)|%0a|%0d|%22|%27|%3c|%3e|%00)(.*)(/\*|alter|base64|benchmark|cast|concat|convert|create|encode|declare|delete|drop|insert|md5|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|eval)(.*)(\(|%28) [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_QUERY_STRING:%1___%2___%3]
</IfModule>
# 7G:[REQUEST URI]
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} (\^|`|<|>|\\|\|) [NC,OR]
RewriteCond %{REQUEST_URI} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{REQUEST_URI} (=?\\(\'|%27)/?)(\.) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(\*|\"|\'|\.|,|&|&?)/?$ [NC,OR]
RewriteCond %{REQUEST_URI} (\.)(php)(\()?([0-9]+)(\))?(/)?$ [NC,OR]
RewriteCond %{REQUEST_URI} (/)(vbulletin|boards|vbforum)(/)? [NC,OR]
RewriteCond %{REQUEST_URI} /((.*)header:|(.*)set-cookie:(.*)=) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(ckfinder|fck|fckeditor|fullclick) [NC,OR]
RewriteCond %{REQUEST_URI} (\.(s?ftp-?)config|(s?ftp-?)config\.) [NC,OR]
RewriteCond %{REQUEST_URI} (\{0\}|\"?0\"?=\"?0|\(/\(|\.\.\.|\+\+\+|\\\") [NC,OR]
RewriteCond %{REQUEST_URI} (thumbs?(_editor|open)?|tim(thumbs?)?)(\.php) [NC,OR]
RewriteCond %{REQUEST_URI} (\.|20)(get|the)(_)(permalink|posts_page_url)(\() [NC,OR]
RewriteCond %{REQUEST_URI} (///|\?\?|/&&|/\*(.*)\*/|/:/|\\\\|0x00|%00|%0d%0a) [NC,OR]
RewriteCond %{REQUEST_URI} (/%7e)(root|ftp|bin|nobody|named|guest|logs|sshd)(/) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(etc|var)(/)(hidden|secret|shadow|ninja|passwd|tmp)(/)?$ [NC,OR]
RewriteCond %{REQUEST_URI} (s)?(ftp|http|inurl|php)(s)?(:(/|%2f|%u2215)(/|%2f|%u2215)) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(=|\$&?|&?(pws|rk)=0|_mm|_vti_|cgi(\.|-)?|(=|/|;|,)nt\.) [NC,OR]
RewriteCond %{REQUEST_URI} (\.)(ds_store|htaccess|htpasswd|init?|mysql-select-db)(/)?$ [NC,OR]
RewriteCond %{REQUEST_URI} (/)(bin)(/)(cc|chmod|chsh|cpp|echo|id|kill|mail|nasm|perl|ping|ps|python|tclsh)(/)?$ [NC,OR]
RewriteCond %{REQUEST_URI} (/)(::[0-9999]|%3a%3a[0-9999]|127\.0\.0\.1|localhost|loopback|makefile|pingserver|wwwroot)(/)? [NC,OR]
RewriteCond %{REQUEST_URI} (\(null\)|\{\$itemURL\}|cAsT\(0x|echo(.*)kae|etc/passwd|eval\(|self/environ|\+union\+all\+select) [NC,OR]
RewriteCond %{REQUEST_URI} (/)?j((\s)+)?a((\s)+)?v((\s)+)?a((\s)+)?s((\s)+)?c((\s)+)?r((\s)+)?i((\s)+)?p((\s)+)?t((\s)+)?(%3a|:) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(awstats|(c99|php|web)shell|document_root|error_log|listinfo|muieblack|remoteview|site((.){0,2})copier|sqlpatch|sux0r) [NC,OR]
RewriteCond %{REQUEST_URI} (/)((php|web)?shell|crossdomain|fileditor|locus7|nstview|php(get|remoteview|writer)|r57|remview|sshphp|storm7|webadmin)(.*)(\.|\() [NC,OR]
RewriteCond %{REQUEST_URI} (/)(author-panel|bitrix|class|database|(db|mysql)-?admin|filemanager|htdocs|httpdocs|https?|mailman|mailto|msoffice|mysql|_?php-my-admin(.*)|tmp|undefined|usage|var|vhosts|webmaster|www)(/) [NC,OR]
RewriteCond %{REQUEST_URI} (base64_(en|de)code|benchmark|child_terminate|curl_exec|e?chr|eval|function|fwrite|(f|p)open|html|leak|passthru|p?fsockopen|phpinfo|posix_(kill|mkfifo|setpgid|setsid|setuid)|proc_(close|get_status|nice|open|terminate)|(shell_)?exec|system)(.*)(\()(.*)(\)) [NC,OR]
RewriteCond %{REQUEST_URI} (/)(^$|00.temp00|0day|3index|3xp|70bex?|admin_events|bkht|(php|web)?shell|c99|config(\.)?bak|curltest|db|dompdf|filenetworks|hmei7|index\.php/index\.php/index|jahat|kcrew|keywordspy|libsoft|marg|mobiquo|mysql|nessus|php-?info|racrew|sql|vuln|(web-?|wp-)?(conf\b|config(uration)?)|xertive)(\.php) [NC,OR]
RewriteCond %{REQUEST_URI} (\.)(7z|ab4|ace|afm|ashx|aspx?|bash|ba?k?|bin|bz2|cfg|cfml?|cgi|conf\b|config|ctl|dat|db|dist|dll|eml|engine|env|et2|exe|fec|fla|git|hg|inc|ini|inv|jsp|log|lqd|make|mbf|mdb|mmw|mny|module|old|one|orig|out|passwd|pdb|phtml|pl|profile|psd|pst|ptdb|pwd|py|qbb|qdf|rar|rdf|save|sdb|sql|sh|soa|svn|swf|swl|swo|swp|stx|tar|tax|tgz|theme|tls|tmd|wow|xtmpl|ya?ml|zlib)$ [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REQUEST_URI:%1___%2___%3]
</IfModule>
# 7G:[USER AGENT]
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|%0a|%0d|%27|%3c|%3e|%00|0x00) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (ahrefs|alexibot|majestic|mj12bot|rogerbot) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ((c99|php|web)shell|remoteview|site((.){0,2})copier) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (econtext|eolasbot|eventures|liebaofast|nominet|oppo\sa33) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (base64_decode|bin/bash|disconnect|eval|lwp-download|unserialize|\\\x22) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (acapbot|acoonbot|asterias|attackbot|backdorbot|becomebot|binlar|blackwidow|blekkobot|blexbot|blowfish|bullseye|bunnys|butterfly|careerbot|casper|checkpriv|cheesebot|cherrypick|chinaclaw|choppy|clshttp|cmsworld|copernic|copyrightcheck|cosmos|crescent|cy_cho|datacha|demon|diavol|discobot|dittospyder|dotbot|dotnetdotcom|dumbot|emailcollector|emailsiphon|emailwolf|extract|eyenetie|feedfinder|flaming|flashget|flicky|foobot|g00g1e|getright|gigabot|go-ahead-got|gozilla|grabnet|grafula|harvest|heritrix|httrack|icarus6j|jetbot|jetcar|jikespider|kmccrew|leechftp|libweb|linkextractor|linkscan|linkwalker|loader|masscan|miner|mechanize|morfeus|moveoverbot|netmechanic|netspider|nicerspro|nikto|ninja|nutch|octopus|pagegrabber|petalbot|planetwork|postrank|proximic|purebot|pycurl|python|queryn|queryseeker|radian6|radiation|realdownload|scooter|seekerspider|semalt|siclab|sindice|sistrix|sitebot|siteexplorer|sitesnagger|skygrid|smartdownload|snoopy|sosospider|spankbot|spbot|sqlmap|stackrambler|stripper|sucker|surftbot|sux0r|suzukacz|suzuran|takeout|teleport|telesoft|true_robots|turingos|turnit|vampire|vikspider|voideye|webleacher|webreaper|webstripper|webvac|webviewer|webwhacker|winhttp|wwwoffle|woxbot|xaldon|xxxyy|yamanalab|yioopbot|youda|zeus|zmeu|zune|zyborg) [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_USER_AGENT:%1]
</IfModule>
# 7G:[REMOTE HOST]
<IfModule mod_rewrite.c>
RewriteCond %{REMOTE_HOST} (163data|amazonaws|colocrossing|crimea|g00g1e|justhost|kanagawa|loopia|masterhost|onlinehome|poneytel|sprintdatacenter|reverse.softlayer|safenet|ttnet|woodpecker|wowrack) [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REMOTE_HOST:%1]
</IfModule>
# 7G:[HTTP REFERRER]
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC,OR]
RewriteCond %{HTTP_REFERER} (order(\s|%20)by(\s|%20)1--) [NC,OR]
RewriteCond %{HTTP_REFERER} (blue\spill|cocaine|ejaculat|erectile|erections|hoodia|huronriveracres|impotence|levitra|libido|lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby|ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo) [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_HTTP_REFERRER:%1]
</IfModule>
# 7G:[REQUEST METHOD]
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|trace|track) [NC]
RewriteRule .* - [F,L]
# RewriteRule .* /7G_log.php?log [END,NE,E=7G_REQUEST_METHOD:%1]
</IfModule>

5.1 – Falls Probleme mit der 7G auftauchen, nutze die 6G-Firewall [2020]

In einigen wenigen Fällen kann es zu Problemen bei der Nutzung der 7G-Firewall geben. Sie läuft trotz einer ausreichenden Testphase nicht auf allen Websites ohne Fehler. Sollten Probleme auftauchen, nutze stattdessen die 6G-Firewall der neuesten Version. Der Link zum Artikel von Jeff Starr mit dem Code: 6G Firewall 2020.

# 6G FIREWALL/BLACKLIST Version 2020
# @ https://perishablepress.com/6g/
# 6G:[QUERY STRING]
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (eval\() [NC,OR]
RewriteCond %{QUERY_STRING} (127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
RewriteCond %{QUERY_STRING} (base64_encode)(.*)(\() [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|\[|%) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
RewriteCond %{QUERY_STRING} (\\|\.\.\.|\.\./|~|`|<|>|\|) [NC,OR]
RewriteCond %{QUERY_STRING} (boot\.ini|etc/passwd|self/environ) [NC,OR]
RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?)\.php [NC,OR]
RewriteCond %{QUERY_STRING} (\'|\")(.*)(drop|insert|md5|select|union) [NC]
RewriteRule .* - [F]
</IfModule>
# 6G:[REQUEST METHOD]
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
RewriteRule .* - [F]
</IfModule>
# 6G:[REFERRER]
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_REFERER} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{HTTP_REFERER} (semalt.com|todaperfeita) [NC]
RewriteRule .* - [F]
</IfModule>
# 6G:[REQUEST STRING]
<IfModule mod_alias.c>
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)(~|`|<|>|:|;|,|%|\\|\{|\}|\[|\]|\|)
RedirectMatch 403 (?i)/(=|\$&|_mm|cgi-|muieblack)
RedirectMatch 403 (?i)(&pws=0|_vti_|\(null\)|\{\$itemURL\}|echo(.*)kae|etc/passwd|eval\(|self/environ)
RedirectMatch 403 (?i)\.(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$
RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell)\.php
</IfModule>
# 6G:[USER AGENT]
<IfModule mod_setenvif.c>
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
# Apache < 2.3
<IfModule !mod_authz_core.c>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</IfModule>
# Apache >= 2.3
<IfModule mod_authz_core.c>
<RequireAll>
Require all Granted
Require not env bad_bot
</RequireAll>
</IfModule>
</IfModule>

6 – 7G Addon gegen das aggressive Scannen von Upload-Dateien

Dieses kleine Addon stoppt die zum Teil sehr aggressiven Angriffe auf Uploads-relevante Ziele, die sich hauptsächlich auf Uploadify, Plupload, TimThumb und ähnliches konzentrieren. Doch auch gegen normale WP-Dateien richten sich die Angriffe, wie zum Beispiel wp-config.php und die xmlrpc.php. Das Addon stoppt über 90% dieser Angriffe.

# 7G Addon: Stop Aggressive Scanning for Uploads-Related Targets
# https://perishablepress.com/stop-aggressive-scanning-uploads/
<IfModule mod_rewrite.c>
# RewriteCond %{REQUEST_URI} /php(unit)?/ [NC,OR]
# RewriteCond %{REQUEST_URI} \.(aspx?|env|git(ignore)?|phtml|rar|well-known) [NC,OR]
# RewriteCond %{REQUEST_URI} /(cms|control_panel|dashboard|home_url=|lr-admin|manager|panel|staff|webadmin) [NC,OR]
# RewriteCond %{REQUEST_URI} /(adm(in)?|blog|cache|checkout|controlpanel|ecommerce|export|magento(-1|web)?|market(place)?|mg|onli(n|k)e|orders?|shop|tmplconnector|uxm|web?store)/ [NC,OR]
RewriteCond %{REQUEST_URI} (_timthumb_|timthumb.php) [NC,OR]
RewriteCond %{REQUEST_URI} /(install|wp-config|xmlrpc)\.php [NC,OR]
RewriteCond %{REQUEST_URI} /(uploadify|uploadbg|up__uzegp)\.php [NC,OR]
RewriteCond %{REQUEST_URI} /(comm\.js|mysql-date-function|simplebootadmin|vuln\.htm|www\.root\.) [NC,OR]
RewriteCond %{REQUEST_URI} /(admin-uploadify|fileupload|jquery-file-upload|upload_file|upload|uploadify|webforms)/ [NC,OR]
RewriteCond %{REQUEST_URI} /(ajax_pluginconf|apikey|connector(.minimal)?|eval-stdin|f0x|login|router|setup-config|sssp|vuln|xattacker)\.php [NC]
RewriteRule .* - [F,L]
</IfModule>

7 – WordPress-Dateien gegen Zugriff blocken

Dieser Bereich sperrt den Zugriff von außen auf so extrem wichtige und sensible Dateien wie die wp-config.php, die install.php und den sehr gefährdeten wp-includes Ordner.

# No access to the install.php
<files install.php>
Order allow,deny
Deny from all
</files>
# No access to the wp-config.php 
<files wp-config.php>
Order allow,deny
Deny from all
</files>
# No access to the readme.html
<files readme.html>
Order Allow,Deny
Deny from all
Satisfy all
</Files>
# No access to the liesmich.html for DE Edition
<Files liesmich.html>
Order Allow,Deny
Deny from all
Satisfy all
</Files>
# No error log access 
<files error_log>
Order allow,deny
Deny from all
</files>
#No access to the .htaccess und .htpasswd
<FilesMatch "(\.htaccess|\.htpasswd)">
Order deny,allow
Deny from all
</FilesMatch>
# Block access to includes folder
<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>

8 – Hotlink Protection gegen Bildklau

Das Hotlinking verhindert, dass Deine Bilder auf anderen Websites verlinkt werden können und somit die Ressourcen Deines Webhostings negativ beeinflussen. Mit diesem Schutz werden Deine Bilder nur dort angezeigt, wo sie es auch sollen. Auf Deiner Website. Du musst nur das Wort »domain« in Zeile 6 gegen Deine Domain tauschen. Bei mir steht dort andreas-hecht.

Ich bitte zu beachten, dass mit dieser Einstellung keine Bilder beim Teilen der Beiträge in den Sozialen Medien angezeigt werden.
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER}     !^$
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} \.(gif|jpe?g?|png)$           [NC]
RewriteCond %{HTTP_REFERER}     !^https?://([^.]+\.)?domain\. [NC]
RewriteRule \.(gif|jpe?g?|png)$                             - [F,NC,L]
</ifModule>

9 – Schutz gegen den »ReallyLongRequest« Banditen

Der »ReallyLongRequest« Bandit ist eine recht neue Bedrohung, die nicht direkt schädlich ist, sondern den Server mit gigantisch vielen Anfragen „erschlagen“ will. Das kann unter Umständen dazu führen, dass Deine Website extrem langsam wird oder nicht mehr erreichbar ist.

»ReallyLongRequest« Bandit heißt der Bot deshalb, weil die gigantisch langen Anfragen alle mit »YesThisIsAReallyLongRequest…« beginnen. Um den Server zu entlasten, blockieren wir diese nutzlosen Anfragen.

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} .* [NC]
RewriteCond %{THE_REQUEST}  (YesThisIsAReallyLongRequest|ScanningForResearchPurpose) [NC,OR]
RewriteCond %{QUERY_STRING} (YesThisIsAReallyLongRequest|ScanningForResearchPurpose) [NC]
RewriteRule .* - [F,L]
</IfModule>

10 – Schütze Deinen Adminbereich mittels HTTP-Veriegelung

Mit der Kombination aus .htaccess und .htpasswd erzeugst Du einen sehr wirksamen Schutz gegen das Hacking Deines Adminbereichs. Du musst nur den Pfad zu Deiner .htpasswd anpassen.

# If you want to use it, comment it out and set your path to .htpasswd
#<Files wp-login.php>
#AuthName "Admin-Bereich"
#AuthType Basic
#AuthUserFile /usr/local/www/apache24/your-path/your-domain.com/.htpasswd 
#require valid-user
#</Files>

11 – Die XML-RPC Datei sperren

Die XML-RPC Datei ist zusammen mit dem Adminbereich von WordPress das beliebteste Angriffsziel.

Die Schnittstelle ist ein nützliches Werkzeug für die Verwaltung von Inhalten. Sie dient dazu, dass man mittels der Desktop– und der Smartphone-Apps die Website verwalten und Artikel verfassen kann. Ebenso kümmert sie sich um Pingbacks. Die Pingback-API ermöglicht eine Art »Vernetzung« zwischen den Blogs und dient gleichzeitig als Schnittstelle, um WordPress über externe Programmen verwalten zu können.

Genau diese Funktionen sorgen für teilweise wesentlich heftigere Angriffsorgien als auf den Adminbereich selbst. Denn auch über die Schnittstelle haben Angreifer dann vollen Zugriff auf die Website.

### @see https://digwp.com/2009/06/xmlrpc-php-security/
<Files xmlrpc.php>
Order Deny,Allow
Deny from all
</Files>

12 – Der Referrer Header für mehr Datenschutz

Wenn Du auf einen Link klickst, sendet Dein Browser den Header HTTP Referrer an den Webserver, auf dem sich die Zielwebseite befindet. Der Header enthält die vollständige URL der Seite, von der Du gekommen bist. So können Websites sehen, wo der Traffic herkommt. Der Header wird auch gesendet, wenn externe Ressourcen (z. B. Bilder, Schriftarten, JS und CSS) geladen werden.

Der Referrer-Header ist ein Albtraum für die Privatsphäre, da Websites und Dienste Dich über das Internet verfolgen und Deine Surfgewohnheiten (und somit möglicherweise private, vertrauliche Informationen) erkennen können, insbesondere in Verbindung mit Cookies.

Angenommen, Du bist bei Facebook angemeldet. Du besuchst eine Seite mit der URL http://www.some-hospital.com/some-medical-condition. Auf dieser Seite klickst Du auf einen Link zu Deinem Facebook-Profil. Dein Browser sendet dann Referrer: http://www.some-hospital.com/some-medical-condition zu www.facebook.com, zusammen mit Deinen Facebook-Cookies, so dass Facebook Deine Identität mit dieser bestimmten Seite verknüpfen kann.

Das Problem wird noch verschlimmert durch die Tatsache, dass viele Webseiten Ressourcen wie Bilder und Skripte von Dutzenden von Drittanbietern laden, indem sie alle Informationen an sie senden, wobei der typische Besucher keine Ahnung hat, dass dies geschieht.

Gut ist, dass dieser datenschutzrechtliche SuperGau unterbunden werden kann durch den einfachen Befehl an den Browser, keinen Referrer zu senden.

## No-Referrer-Header
<IfModule mod_headers.c>
Header set Referrer-Policy "no-referrer"
</IfModule>

13 - Die HTTP-Security-Header - Update 01/2022

Jedes Mal, wenn ein Browser eine Seite von einem Webserver anfordert, antwortet der Server mit der Auslieferung der Seite und sendet einen HTTP-Response-Header mit dem Inhalt. Diese Header können nicht nur alltägliche Dinge wie den Zeichensatz enthalten, sondern auch sicherheitsrelevante Einstellungen senden.

Hierfür nutzt man die sogenannten HTTP-Response-Header, mit denen man das Verhalten eines Browsers steuern kann. Ein Strict-Transport-Security-Header würde dem Browser zum Beispiel die Anweisung erteilen, nur über HTTPS zu kommunizieren.

### @see https://scotthelme.co.uk/hardening-your-http-response-headers
## X-FRAME-OPTIONS-Header
<IfModule mod_headers.c>
Header set X-Frame-Options "sameorigin"
</IfModule>
## Strict Origin when cross origin Header
#@see https://scotthelme.co.uk/a-new-security-header-referrer-policy/
<IfModule mod_headers.c>
Header set Referrer-Policy "strict-origin-when-cross-origin"
</IfModule>
## X-XSS-PROTECTION-Header
<IfModule mod_headers.c>
Header set X-XSS-Protection "1; mode=block"
</IfModule>
## X-Content-Type-Options-Header
<IfModule mod_headers.c>
Header set X-Content-Type-Options "nosniff"
</IfModule>
## Strict-Transport-Security-Header - für HTTPS
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
</IfModule>
# Upgrade Insecure Requests to prevent mixed content
<ifModule mod_headers.c>
Header always set Content-Security-Policy "upgrade-insecure-requests"
</IfModule>

Der neue Expect-CT Header

Dieser neue Header wird zurzeit nur von Google Chrome unterstützt. Zudem befindet er sich noch im Status IETF Experimental. Trotzdem habe ich den Header bereits integriert, weil die Idee hinter diesem Header hervorragend ist. Denn wenn eine Webseite den Expect-CT Header ausgibt, wird Google Chrome überprüfen, ob ein HTTPS-Zertifikat für diese Webseite in den öffentlichen Certificate Transparency Logs enthalten ist.

Das verhindert, dass falsche Zertifikate unbemerkt für die betreffende Website verwendet werden können. Eine Man-in-the-middle Attacke ist dadurch nicht mehr so einfach möglich.

Folgende Einstellungen setzt der Header zurzeit:

  • enforce: Signalisiert dem Browser, dass Certificate-Transparency durchgesetzt werden soll. Falsche Zertifikate (keine Übereinstimmung in den Certificate-Transparency-Logs) führen zu einem Abbruch der Verbindung.
  • max-age: Der Browser speichert die empfangene Richtlinie für 6 Stunden (21600 Sekunden) in seinem Cache. Ist die Zeit abgelaufen, wird der Browser erneut eine CT-Richtlinie (bei einer Webseite) anfragen.
<IfModule mod_headers.c>
Header set Expect-CT "enforce, max-age=21600"	
</IfModule>

Der neue Security Header "upgrade-insecure-requests"

Der "upgrade-insecure-requests"-Header ist für die Sicherheit des Inhalts einer Website gedacht, um Browsern mitzuteilen, dass sie ausschliesslich HTTPS- statt HTTP-Anfragen stellen sollen. Er behebt zum Beispiel auch Probleme mit gemischten Inhalten bei der Umstellung auf HTTPS. (Gemischte Inhalte: Website wird über HTTPS abgerufen, Bilder und Grafiken jedoch noch über HTTP).

Er kann als HTTP-Header oder als Meta-Tag auf Seitenebene verwendet werden.

Beispiel 1: Der HTTP-Header in der .htaccess

#HTTP Header
<ifModule mod_headers.c>
Header always set Content-Security-Policy "upgrade-insecure-requests;"
</IfModule>


Beispiel 2:
Der Meta-Tag

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">

14 - Die WordPress Standard Regeln

Dies sind die Standard-Regeln, die jede WordPress-Website während der Installation anlegt. Wenn Du eine Multisite nutzt, oder sich dein WordPress in einem Unterordner befindet, müssen diese Regeln angepasst werden.

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

Die WordPress .htaccess als Zip-Datei zum Download

Kategorie: WordPress
Tags:

Du bist auf der Suche nach einer seriösen SEO Agentur?

Dir hat unser Artikel gefallen und Du möchtest unsere Hilfe in Anspruch nehmen? Dann melde dich bei unverbindlich bei uns. Wir freuen uns auf Deine Anfrage!

Andreas Hecht

Der Autor: Andreas Hecht

Andreas ist der Gründer und CEO der SEO Agentur Hamburg und Experte für Suchmaschinenoptimierung und WordPress Entwicklung.

Jetzt weitere interessante Beiträge lesen

292 Kommentare. Hinterlasse eine Antwort

  • Hallo.
    Danke für den tollen Service.
    Bei korrekter Einbindung wären dann PlugIns wie NinjaFirewall oder Wordfence obsolet?
    Freue mich auf Feedback
    Grüße
    Max

    Antworten
    • Andreas Hecht
      22. Juni 2020 15:05

      Hi Max,

      das ist so. Weg mit dem Kram:-)

      Antworten
      • Danke für die Info. Wieso zeigt mir dann Ninja Firewall noch zahlreiche Attack-Versuche jeglicher Schwere an? Sind dies dann keine Angriffe?

        Antworten
        • Andreas Hecht
          25. Juni 2020 11:17

          Angriffe gibt es immer und zu jeder Zeit und bei jeder Website auf diesem Planeten. Die Frage ist nur, ob sie erfolgreich sind. Wenn meine .htaccess installiert ist und Du für den Adminbereich ein wirklich sicheres Passwort verwendest, kommt da nichts durch.

          Antworten
  • Holger Walbrück
    21. Juni 2020 20:18

    Wirklich beeindruckend diese .htaccess! Habe ich 1:1 ohne Probleme übernehmen können. Danke für diese Mühe!
    Wenn ich das richtig verstehe (ich bin nahezu Laie), ergibt sich zusammen mit den empfohlenen Verbesserungen in der functions.php eine recht weitgehende Absicherung der WordPress-Installation. Gibt es überhaupt Security-Plugins, die einen wirklichen Mehrwert gegenüber diesen Maßnahmen bieten?

    Antworten
    • Andreas Hecht
      21. Juni 2020 20:27

      Hi Holger,

      danke für Deinen Kommentar! Und nein, Security-Plugins bieten nicht einmal Ansatzweise diesen Schutz.

      Antworten
      • Holger Walbrück
        22. Juni 2020 0:23

        Prima! Dann kann ich mir ja die Installation eines weiteren, fummelig zu konfigurierenden Plugins sparen. Je schlichter und übersichtlicher, desto einfacher die Administration.

        Antworten
    • Hallo, wo finde ich den die empfohlenen Verbesserungen zur functions.php?

      Antworten
  • Frank Schmittlein
    7. Juni 2020 21:52

    Hallo Andreas,

    ich hatte gerade ein Problem mit dem Passwortschutz von WordPress und der .htaccess. Erklärung und Lösung habe ich hier gefunden: https://www.wp-wartung24.de/passwortgeschuetzte-seiten-und-referrer-policies/

    Vielleicht kannst Du den betroffenen Teil der .htaccess von Dir anpassen?

    Danke und Gruß
    Frank

    Antworten
  • Moin Andreas,

    vielen Dank für die tolle Dokumentation.

    Leider finde ich den Komplett-Download der gesamten Module nicht.
    Irgendwie führt der Klick auf den Button ins Leere.

    Und kann man die http zu https Umleitung auch dann nutzen, wenn man das Plugin Really Simple SSL nutzt?

    Danke und Grüße:
    Keno

    Antworten
    • Andreas Hecht
      8. Mai 2020 11:27

      Hallo Keno,

      danke für die Fehlermeldung. Ist jetzt behoben.
      Zu Deiner Frage: Höchstwahrscheinlich. Du musst es ausprobieren. Gibt es eine Fehlermeldung, kommentieren den Bereich wieder aus. Übrigens sollte eine HTTPS-Umstellung niemals über ein Plugin geschehen, das kann eine Menge Ärger verursachen. Mache es lieber gleich richtig. Hier findest Du eine gute Anleitung dafür. https://seoagentur-hamburg.com/7326/

      Antworten
  • Jonas Zander
    23. März 2020 19:35

    Hallo Andreas,
    vielen Dank. Das sieht alles sehr gut aus bei mir.
    Zwei Fragen:
    1. securityheaders.com vermisst bei mir Feature-Policy. Was habe ich übersehen?
    2. Es gibt anscheinend laut securityheaders.com ein Problem mit einem Cookie. T“he ‚httpOnly‘ flag is not set on this cookie. The ’secure‘ flag is not set on this cookie. There is no Cookie Prefix on this cookie. This is not a SameSite Cookie.“ Hast du einen Tipp, wo ich schauen muss oder weitere Hilfe bekomme?

    Falls du es selber prüfst: nicht wundern: den CSP Teil habe ich (noch) weggelassen.

    Danke im Voraus.
    Bleib gesund
    Jonas

    Antworten
  • Hallo Andreas,

    der Schutz des Adminbereich mittels HTTP-Veriegelung scheint sehr simpel zu sein.

    Wie sieht dann die .htpasswd aus? Ist dort irgendeine Information verwahrt?

    Danke und Gruß
    Max

    Antworten
  • Moin Andreas,
    großartige Deine Arbeit mit der .htaccess. Vielen und mach bitte weiter so!

    Zeile 384 >> „Change »?domain\« in line 361 to your domain name“
    Die korrekte Zeile wäre (bei mir unter Notepad++) >> 392

    Frage:
    Wenn ich bei mir unter /root einen Ordner namens „dwl“ besitze, dann kann ich mit der 7G/6G keine Dateien aus dem Ordner mehr downloaden .. wie stell ich das ab?

    Danke im voraus für Deine Hilfe.
    Grüße aus Hemmoor
    Frank

    Antworten
  • Hallo, ich habe 2 kleine Probleme mit deine .htacess. zum einen funktioniert das ganz nicht mit der Firewall 7G, mit der 6G hab ich keine Probleme. Passt da eventuell noch irgendwas nicht? Ebenfalls bekomme ich mit dem Browser MS Edge keine Bilder auf meinen Seiten angezeigt. An welcher Einstellung könnte das liegen?

    LG Andreas

    Antworten
  • Kann es sein, dass das mit
    ServerSignature Off
    nicht funktioniert?

    Antworten
  • Hallo, ich habe nochmal eine andere Frage, Habe über deine .htacces die gzip Kompression eingeschaltet. Ebenfalls lasse ich Autoptimize und den Cache Enabler laufen. Wieso sagt mir Pingdom Tools ein Hinweis mit Grade D bei der Gzip Compression? Muss ich da nochmehr oder was anderes einstellen?

    LG Michael

    Antworten
  • Hi, du hast ja in deiner .htaccess den Teil für die gzip compression mit implementiert. Nur Warum zeigt pingdom tools immer noch an, das diese nicht stattfindet?

    LG

    Antworten
  • Hallo Andreas,
    dann habe ich da noch eine weitere Frage. Nutze als CachePlugin das Borlabs Cache in der freien Version. Funktioniert das auch im Zusammenspiel mit Autoptimize oder sollte ich hier zwingend den Cache Enabler verwenden?

    LG

    Antworten
    • Und wie siehts hier mit der wp-config.php aus? Reicht es diese einfach zu schützen oder ist es sogar sinnvoll diese in einen anderen Ordner zu schieben?

      LG

      Antworten
      • Andreas Hecht
        29. Januar 2020 11:28

        Hi,

        guckst Du Dir vielleicht die .htaccess mal genauer an?

        Antworten
        • Hi, was meinst du? Ich habe jetzt schon häufiger gelesen, das man die wp-config auch in einen Unterordner packen kann und die im Root nur auf die verschobene Datei verweist.

          Antworten
          • Andreas Hecht
            30. Januar 2020 12:44

            Wenn Du Dir die Datei mal richtig angeschaut hättest, würdest Du wissen, dass die wp-config.php bereits geschützt ist. DAS MEINE ICH.

    • Andreas Hecht
      29. Januar 2020 11:26

      Hi,

      mit Cache Enabler wird die Website schneller.

      Antworten
      • Ja das macht das Borlabs Cache auch und es hat in vielen Tests perfekt angeschnitten. Ich weiß natürlich nicht wie das Zusammenspiel mit Autopimize und deiner .htaccess so ist. Deswegen frage ich ich

        Antworten
  • Hallo Andreas, ich habe mal eine Frage zum Schutz des Admin – Bereiches. Du setzt ja nur einen Schutz auf die wp-login.php. Reicht das oder sollte man auch noch einen Schutz auf den Ordner wp-admin setzen?
    Heisst also wenn ich meine Domain mit wp-admin aufführe gibt es dann auch das Login-Fenster?
    Ich setze auch gerne mal das Plugin WPS Hide Login ein, wenn ich hier also aus wp-admin einfach nur login machen, muss ich dann darauf auch noch einen Schutz setzen? Wenn ja wo?

    LG Michael

    Antworten
    • Andreas Hecht
      28. Januar 2020 18:16

      Hi Michael,

      das reicht vollkommen. Es wird sowohl die wp-login.php als auch der Ordner /wp-admin/ komplett geschützt. WPS Hide Login und ähnliche Plugins solltest Du nicht einsetzen, die bieten keine echte Sicherheit. Setze den HTTP-Schutz ein und niemand hackt Deinen Adminbereich.

      Antworten
  • Hallo Andreas,
    ich hab deine tolle .htaccess eingesetzt und bin bestens zufrieden und habe keinerlei Probleme mit unangenehmen sachen, recht herzlichen Danke für Deine Zeit und Arbeit die du uns zur Verfügung stellst.

    Habe jetzt ein Theme in einsatz bei dem ich eine Fehlermeldung bekomme:
    Fehler beim Laden der Plugin-URL: https://meineurl.com/wp-content/themes/enfold/config-templatebuilder/avia-template-builder/assets/js/avia-tinymce-buttons-4. js

    Was muss ich in der .htacces deaktivieren damit diese Datei geladen wird.

    Ich sage schon mal Danke im Voraus
    Ernest

    Antworten
    • Andreas Hecht
      10. Dezember 2019 14:26

      Hallo Ernest,

      das liegt nicht an der .htaccess. Da würde ich mal die Console zu Rate ziehen.

      Antworten
      • Hallo Andreas,

        ich habe in der htaccess mal alles rausgenommen – bis auf: „Beginn WordPress“ und „Protect wp-login.

        Dannach hat meine Internetseite wieder funktioniert.

        Weil ich wissen wollte von welchen Modul (Firewall etc.) habe ich alle Sektionen einzeln rausgenommen und dann die Seite probiert. Es kammen keine Fehler mehr vor.

        Also ist es so wie du geschrieben hast: es liegt nicht an der htaccess.

        Deshalb werden ich diesen Themeherstelle auf die Nerven gehen.

        Danke für die Hilfestellung
        Ernest

        Antworten
      • Hallo Andreas,

        nur zur Info!

        Es hat doch an der Firewall G7 im Teilbereich: # 7G:[REQUEST URI] gelegen.
        Hab es jetzt gegen Firewall G6 getauscht, jetzt funktioniert es, bekomme manchmal Darstellungfehler wenn ich zwischen den Layout-Editor und dem Standart-Editor hin und her switche.
        Mal sehen wie ich jetzt weiter mache, ist ja nur ein Testlauf – oder ob ich dieses Theme in die Tonne kloppe.

        Mit Besten Grüssen
        Ernest

        Antworten
  • Hallo Andreas,
    schön, dass sich jemand mal in einem Artikel dem Thema ziemlich erschöpfend widmet.

    Zum Browser-Caching habe ich aber mal eine Frage bezüglich der Zeitangabe, wie lange etwas im Cache bleiben soll. Ich lese da z.B. hier im Artikel, aber auch bei anderen Quellen immer wieder mal „0 Sekunden“, also z.B. :
    ExpiresByType application/ld+json „access plus 0 seconds“

    Was macht es für einen Sinn, eine Caching-Zeit von „0“ festzulegen? Wozu dann überhaupt cachen?
    So ein JSON-LD-Code ändert sich nicht oft im Regelfall und selbst wenn, hat es keine Auswirkung auf den Besucher, da das reine Meta-Informationen für Sumas sind. Warum nicht besser 1 Monat oder so?

    Grüße,

    Martin

    Antworten
    • Andreas Hecht
      5. August 2019 12:48

      Hi,

      JSON zu cachen wäre eine echt schlechte Idee. Wie kommst Du darauf, dass sich da nichts ändert? Die API wird mittlerweile von etlichen Anwendungen genutzt, die Live-Daten zur Verfügung stellen. Jede Steuerung von WordPress oder Inhalten von Extern geht über diese API. Wird diese gecacht, sind etliche Daten nicht mehr aktuell.

      Antworten
      • Hallo,
        nicht JSON, sondern JSON-LD-Code für die Sumas. Ich bin kein Experte, aber ich glaube, das sind verschiedene Dinge. Was ich meine, ist z.B. für eine Über-mich-Seite, bei der man sich im JSON-LD-Code als „Person“ den Sumas beschreibt: https://jsonld.com/person/ bzw. bei schema.org: https://schema.org/Person.

        Oder man kann z.B. ein „Event“ damit beschreiben, ein Rezept, einen News-Artikel usw. usw.

        Wenn so ein Code fertig ist, dann kommt er in die WP-Page, in den head oder auch in den body irgendwo und je nach Datentyp ändert sich da meist nichts mehr so schnell. Name, Adresse, Beruf usw. für mich als „Person“ bleiben ja gleich. Wenn ich den Code in die WP-page einfüge, fasse ich den so schnell nicht mehr an. Warum auch. Bei den meisten anderen Dingen, z.B. einem Rezept oder Artikel ist das ähnlich – es sei denn, ich ändere das Rezept bzw. den Artikel selbst. Dann mus man evtl. auch den schema-Code anpassen.

        JSON-LD-Code sind reine Meta-Informationen, ähnlich einer meta description, der Besucher sieht das nicht.

        Antworten
  • Hallo Andreas, vielen Dank für die tolle Arbeit. Hat mir wirklich sehr geholfen.
    Hätte nur eine kurze Frage. Ich habe in meinem Wordpress einen Ordner liegen den ich von außen zugänglich machen will. Wenn dieser mit deiner htaccess angesprochen wird kommt die Meldung 403. Was müsste ich ändern um das zu erlauben. Vielen Dank im Voraus.

    Antworten
  • Setzen Sie diese htaccess auch auf https://andreas-hecht.com/ ein?
    Wenn ja, dann gibt es laut PageSpeed Insights etwas zu verbessern. Es wird folgende Empfehlungen gegeben:
    Statische Inhalte mit einer effizienten Cache-Richtlinie bereitstellen
    was sagen Sie dazu?

    Antworten
    • Andreas Hecht
      13. Juli 2019 14:46

      Die .htaccess wird auf Hunderten von Seiten eingesetzt. Und PageSpeed Insights taugt einen Schei… Das solltest Du nun wirklich nicht nutzen. Die Pingdom Tools zeigen Dir den Speed genau. Googles Tool wird nur von Amateuren eingesetzt, die sich die Haare raufen, weil der Scheiß besonders auch seine eigenen Dateien anmahnt.

      Antworten
      • Danke für Ihre Antwort!
        Wenn ich Ihre Seite mit PINGDOM teste, dann wird folgendes vorgeschlagen:
        add expires headers
        die gleiche Meldung kommt auch bei anderen WordPress-Seiten, die ich getestet habe.
        Meiner Meinung haben Sie das doch getan. Was will denn PINGDOM noch? Verstehe ich nicht.

        Antworten
  • Oliver Otterpohl
    4. Juni 2019 6:39

    Hallo Herr Hecht,
    erstmal danke für diese grandiose htaccess.
    Wenn ich die 7G Firewall nutze, komme ich nicht mehr in das Backend. Es wird mir forbidden access ( 403 ) angezeigt. Mit der 6G Firewall klappt alles einwandfrei.

    Ich nutze das Plugin “ WPS Hide Login “ und bin mir sicher, dass es daran liegt. Hätten Sie eine Idee, was ich an der 7G Firewall ändern oder löschen könnte, damit es funktioniert ?

    Vielen Dank
    Grüsse

    Antworten
    • Andreas Hecht
      4. Juni 2019 14:50

      Hallo Herr Otterpohl,

      warum kommen Sie auf die Idee, etwas an der Firewall ändern zu wollen? Das wäre eine total schlechte Idee. Löschen Sie lieber das völlig sinnfreie Plugin und verwenden Sie starke Passwörter. Dann benötigen Sie kein Plugin, dass Ihnen nur Sicherheit vorgaukelt, anstatt sie zu bieten.

      Antworten
  • Dennis Schröder
    21. Mai 2019 15:04

    Hallo Herr Hecht,

    genau nach so einer htaccess habe ich lange gesucht. Nun habe ich sie endlich gefunden. Leider funktioniert die 7G Firewall nicht bei mir. Aber das ist nicht so schlimm, die 6 Version funzt ohne Probleme. Vielen dank dafür.

    Grüße aus Essen

    Antworten
  • Ralph Missing
    20. Mai 2019 15:14

    Hallo,
    ich habe die komplette htaccess Datei in die Website übernommen.
    auf der Webseite gibt es einen Link intern mit Passwortabfrage.
    Dieser Link funktioniert mit dem IE komplett, aber nicht mit dem neuesten Firefox.
    Nach Eingabe des Passwortes erhält man einen weissen Screen.
    Wenn ich die htaccess Datei gegen die standardmäßige austausche, funktioniert es.
    Alle anderen Links arbeiten sonst korrekt. Woran liegt das in Ihrer htacces Datei?

    Danke für einen Tip.
    Gruß
    Ralph Missing

    Antworten
  • Hi Andreas!
    danke erstmal für das Script 🙂 ich glaube deine Übersetzung des Kommentars widerspricht sich…welche Variante stimmt?

    # Comment it out, if you don’t use Let’s Encrypt, because Let’s Encrypt is using .well-known
    # Wenn Du Let’s Encrypt nutzt, kannst Du das nicht verwenden, weil Let’s Encrypt .well-known nutzt.

    Antworten
    • Andreas Hecht
      9. Mai 2019 12:27

      Hi Torsty,

      wenn ich meine Kommentare dazu lese, dann sagen sie beide für mich das Gleiche aus. Nur anders geschrieben. Bei beiden kommt sinngemäß heraus: du kannst den Block nur nutzen, wenn du kein Let’s Encrypt-Zertifikat verwendest.

      Antworten
  • Frank Schmittlein
    6. Mai 2019 10:43

    Hallo Andreas,

    sollte die Datei wp-cron.php nicht auch geschützt werden?

    Gruß Frank

    Antworten
  • Hi,

    aufwändige Zusammenfassung, sehr schön, danke!

    Antworten
  • Hallo Andreas,

    danke für die aktualisierte Version deiner tollen HTACCESS-Datei!

    Bzgl. dem Block „Block Nuisance Requests for Non-Existent Files“ (Zeile 31 – 43) habe ich eine Frage.
    Wenn ich Let’s Encrypt benutze, sollte ich dann den gesamten Block nicht verwenden oder kann ich lediglich die Zeile 40 (RedirectMatch 403 (?i)\.(git|well-known)) mit einem # deaktiviert lassen und den Rest verwenden?

    Ich verwende momentan den gesamten Block und konnte bisher keine negativen Auswirkungen feststellen, obwohl ich Let’s Encrypt bei meiner Seite verwende – oder wirken sich die Einstellungen evtl. an einer anderen Stellen negativ aus?

    Gruß
    Alex

    Antworten
    • Andreas Hecht
      2. Mai 2019 11:41

      Hi,

      Du kannst die Zeile 40 auskommentieren, dann funktioniert Let’s Encrypt bei den meisten Hostern. Negative Auswirkungen gibt es erst, wenn das Zertifikat erneuert werden muss. Dazu muss auf .well-known zugegriffen werden können.

      Antworten
  • Danke für die tolle Zusammenfassung.
    Hat schon jemand herausgefunden warum die Mediathek bei der 7g Firewall nicht funktioniert? Wäre doch sinnvoller das zu fixen als einfach auf die 6g auszuweichen.

    Grüße,
    Peter

    Antworten
  • Hi Andreas,
    für Yoast-Nutzer muss die /wp-content/-.htaccess so aussehen, damit die Sitemaps generiert werden können.
    LG
    Dirk

    Order deny,allow
    Deny from all

    Allow from all

    Antworten
    • Andreas Hecht
      20. April 2019 13:33

      Hi Dirk,

      ich nutze auch Yoast SEO und habe keinerlei Änderungen an meiner .htaccess vorgenommen. Die Generierung der Sitemaps läuft ohne Probleme.

      Antworten
  • Hi,

    schöne Zusammenfassung, top Artikel, danke!
    Gruß
    Rüdiger

    Antworten
  • Hallo,

    spircht irgendetwas dafür oder dagegen diese .htaccess mit der NinjaFirewall für WP zu kombinieren? Ich verwende die jetzt seit über 2 Jahren und bin seither von Hacks verschont geblieben auf über 10 Websites. Davor war das anders. Zumindest hatte ich daruch eine gute Routine zum Bereinigen und Wiederherstellen entwickelt 😉
    LG
    Jürgen

    Antworten
    • Andreas Hecht
      20. April 2019 13:44

      Hallo Jürgen,

      die .htaccess hat bereits eine Firewall integriert, die hervorragend funktioniert und Deine Website optimal schützt. Einer Plugin-Firewall würde ich persönlich grundsätzlich nicht vertrauen.

      Antworten
  • Hendrik Fritzsche
    15. April 2019 13:36

    Hallo Andreas,
    Ich bin Hendrik und erst mal vielen, vielen Dank für deine Mühe und deine Sachkenntnis. Ich bin eher zufällig über diesen tollen Beitrag gestoßen, weil ich mit meiner Seite Probleme hatte.
    Vor etwa einer Woche wollte ich meine Seite https://www.discoflexibel.de/ aufrufen und da wurden unerwartet Sexseiten geöffnet, die man auch nicht mehr schließen konnte. Na toll, eine besondere Promotion für meine Kunden!!!!
    Ich konnte das nur wieder retten, indem ich ein Backup vom März 2019 eingespielt hatte. Leider gingen dann auch die aktuellen Veränderungen verloren.
    Ich habe nun die komplette .htacess_Datei auf meinen Server bei Netcup hochgeladen und bis jetzt funktioniert alles ohne Probleme.
    Ich habe dazu noch 2 Fragen?
    Muss ich nachfolgenden Code noch anpassen oder bleibt der so?
    # No error log access

    Order allow,deny
    Deny from all

    #No access to the .htaccess und .htpasswd

    Order deny,allow
    Deny from all

    Und wie kann ich überprüfen ob das alles so funktioniert wie du das das ja beschreibst?
    Ich bedanke mich jetzt schon für deine Antwort und viele nette Grüße nach Hamburg.

    DJ Hendrik

    Antworten
  • Nachtrag: …auf die über „IfModule !authz_core_module“ bzw. „IfModule authz_core_module“ sowohl Apache 2.2 als auch Apache 2.4+ reagieren… ist irgendwie weggefiltert worden?!

    Antworten
  • Hallo Andreas,

    die Zusammenstellung Deiner .htaccess ist grandios; doch müssten für Apache 2.4 nicht alle Vorkommnisse von:

    Order deny,allow
    Deny from all

    ersetzt werden durch:

    Require all denied

    oder alternativ eine konditionale Direktive zum Einsatz kommen, auf die über bzw. sowohl Apache 2.2 als auch Apache 2.4+ reagieren.

    Siehe: https://htaccessbook.com/access-control-apache-2-4/

    In der 6G-Firewall – Version 2019 (line 58-72) verwendest Du ebenfalls die konditionale Direktive, nicht jedoch im Abschnitt 6 (WordPress-Dateien gegen Zugriff blocken) d.h. im .htaccess (Gist, line 329-369).

    Hat das einen Grund?

    Vielen Dank für Deine Mühe!
    Marcel

    Antworten
  • Vielen vielen Dank, Ihre geniale htaccess!
    Das mit dem EXPECT-CT verstehe ich jedoch noch nicht so recht und dazu habe ich keine Antwort auf meine Frage gefunden oder vielleicht auch habe ich es nicht kapiert.
    Woher bekomme ich das Zertifikat, das durch diesen Header abgefragt wurde überprüft wird?
    Kann ich diesen Header gefahrlos einsetzen und was ist, wenn das Zertifikat falsch ist?

    Antworten
  • Zwischenzeitlich habe ich für die Bilder-Optimierung das Plugin Optimole Images benutzt. Mit etwas Verzögerung fiel mir auf, dass ich keinen Zugriff auf die Mediathek mehr hatte, jedenfalls nicht aus dem Backend heraus. Beim Schreiben konnte ich zugreifen und auch ihren Inhalt sehen. Beim direkten Aufruf wurde nichts angezeigt bis auf eine leere Seite. Ich habe in der .htaccess die Firewall 7 gegen die Version 6 ausgetauscht. Jetzt funktioniert es wieder. Kann das deiner Meinung nach damit zu tun gehabt haben? Danke und beste Grüße H.

    Antworten
  • Das Komische ist, ich hatte in der Zwischenzeit im 7G Bereich mit auskommentieren versucht den Fehler zu finden. Irgendwann war er dann weg. Allerdings ging es auch noch als alles wieder aktiviert war. Muss da noch mal in Ruhe gucken.

    Antworten
  • Hallo Andreas,
    mir ist ein Problem mit deiner htaccess Datei aufgefallen. Ich nutze Akeeba Backup für all meine Wordpress Seiten. Sobald ich eine Seite auf deine wirklich tolle htaccess Datei umstelle funktioniert die Konfigurations-Seite von Akeeba nicht mehr.
    Irgendwie blockiert ein Parameter der htaccess den Zugriff.
    Folgenden Fehler finde ich per Webconsole:
    wp-content/plugins/akeebabackupwp/app/media/js/solo/configuration.min.js?ver=3.4.2.2 net::ERR_ABORTED 403 (Forbidden)
    Kannst du daraus Rückschlüsse auf die Ursache ziehen?
    Danke
    Alex

    Antworten
  • Ah, okay habe gefunden, dass ich Funktion Punkt 3 nicht nutzen kann. Gibt es vielleicht alternative Möglichkeiten?

    Antworten
  • Guten Morgen Herr Hecht,
    Danke für Deine Mühe oben.

    Ich habe eine Frage. Kann es sein, dass ein Eintrag in der .htaccess zu folgender Anzeige im PlugIn „SUCURI“, führt?
    SUCURI: SiteCheck error: Unable to properly scan your site. 403 Forbidden
    Besten Dank

    Antworten
    • Andreas Hecht
      25. März 2019 12:24

      Hi Marcel,

      ja, wenn Du die 7G-Firewall verwendest. Tausche Sie gegen die 6G aus, dann sollte es funktionieren.

      Antworten
  • Hallo Andreas,
    tolles Script, vielen Dank.

    Einen kleinen Hinweis hätte ich da allerdings, bei mir funktionierte nach der Integration des 7G Firewall-Update mein Kontaktformular nicht mehr. Du schriebst ja schon, dass es Probleme geben könnte, nur verwende ich kein WP. ???. Nach dem Zurücksetzen war alles wieder tipi topi. Vieleicht findest Du ja eine Lösung für dieses Problem.

    Beste Grüße

    Antworten
  • Hallo, ich denke das ist eine superSache! Werde ich bald ausprobieren. Danke dafuer! Leider habe ich ein Problem in Punkt 3: Block Nuisance Requests. Was mache ich denn wenn ich gerade ein Let’s Crypt Zertifikat nuze? Muss ich dann komplett auf diese Funktion verzichten?

    Antworten
  • Wow, was für eine tolle Anleitung. Bin seit ein paar Tagen schon auf der Suche nach so etwas gewesen, da ich meine .htaccess bezüglich HTTP Security-Header aufrüsten wollte.

    Habe das auf anderen Seiten gelesen und es ausprobiert. Aber wenn ich meine Seite analysiert habe, hat sich rein gar nichts verändert. Es werden immer noch die gleichen Fehler angezeigt. Dachte das liegt an mir und hab nach weiteren Lösungen gesucht. Und jetzt habe ich deine Beispiele eingefügt (aus Gist) und trotzdem tut sich nichts.

    An was könnte das liegen? Muss ich meinen Hoster (all-inkl) mal besser anschreiben? Bin echt langsam verzweifelt…

    MfG
    Rainer

    Antworten
  • Hallo Andreas,
    super Beitrag von dir, vielen dank dafür!
    Ich habe eine kurze Frage, ich betreibe 2 Seiten von 1 Hoster, dh ich habe im sftp [/] 2 Ordner mit jeweils 2 verschiedenen Ordner IDs von den Seiten.Muss ich das Verzeichniss aus deinen Code irgendwie ändern?

    Antworten
  • Vielen Dank für Ihre schnelle Antwort.

    Antworten
  • Lieber Herr Hecht,

    danke für die geleistete Arbeit und das Sie Ihre Datei auch noch gratis der Community zur Verfügung stellen. Ich hätte ein/zwei Fragen: Kann ich Ihre .htaccess Datei auch in Kombination mit dem Plugin „WP Rocket“ verwenden oder kommt es zu Problemen? Bzw. gibt es ein Plugin (z.B. Sicherheitsplugins wie iTheme Security) welches ich auf keinen Fall zusammen mit Ihrer Datei verwenden sollte?

    Beste Grüße

    Antworten
  • Hey Andreas,
    nochmals vielen Dank an dieser Stelle für deine hammermäßige .htaccess.
    Allerdings wunder ich mich dass die Pingdom Tools das fehlende gzip anmeckern:
    F45 Compress components with gzip
    Das wird doch in der htaccess aktiviert, oder?

    Antworten
  • Hallo Andreas, guten Abend Herr Hecht,
    vielen Dank für diese tolle .htaccess . Ich habe eine kleine Frage. Wie kann ich über die .htaccess eine Verbindung zu Gravatar.com verbieten ? Es gibt zwar viele Möglichkeiten Gravatare zu unterbinden/verbieten usw, ich kenne diese Möglichkeiten fast alle. Ich habe aber einen Code-Schnipsel “ #profile-header .background-avatar “ gefunden, der trotz aller mir bekannten Möglichkeiten Gravatare in meine Seite einbindet. Die für mich einfachste Möglichkeit diese zu verhindern wäre über die .htaccess. Kannst du mir mit einem einfachen Code-Schnipsel weiter helfen ? Vielen Dank im Voraus ! gtx, Olli

    Antworten
    • Andreas Hecht
      8. März 2019 12:32

      Hi Olli,

      warum so kompliziert? Log Dich in WP ein und gehe zu »Einstellungen => Diskussion«. Da kannst Du die Avatare komplett abschalten.
      Avatare abschlaten in WordPress

      Antworten
      • Hallo Anderas,
        erst mal Danke für deine Antwort. Genau diese Lösungsansätze meinte ich, als ich schrieb, ich kenne fast alle. Und genau diese Möglichkeit bringt rein gar nichts. Es werden dann nur die Gravatare ausgeblendet. Die Verbindung zu, und der Datenabgleich mit, Gravatar.com findet trotzdem statt. Und genau das will ich verhindern. Nur das Abschalten, wie du es beschreibst, verhindert nicht den Datenabgleich. Auch die bekannten PlugIns, die Gravatare ausschalten sollen, blenden nur die Bilderchen aus. Die eigentliche Verbindung zu Gravatar.com läuft aber weiter. Ich habe dich schon gezielt nach einer .htaccess Möglichkeit gefragt. Wordpress nimmt mit so vielen Diensten im Hintergrund Verbindung auf, ohne das wir wissen mit welchen. Woher weiß ein PlugIn, dass es ein Update gibt? Das mag ja nett und komfortabel sein. Aber Kontrolle ist etwas anderes. Ich will die Verbindung zu Gravatar.com verhindern.

        Antworten
  • Hallo,

    ich wollte dir gerne mitteilen dass ich nun nach schrittweisem einfügen der htaccess zeilen den Übeltäter für die im wp-admin nicht-fixierte sidebar sowie der fehlenden mouse over effekte gefunden habe:

    RewriteCond %{QUERY_STRING} (globals|mosconfig([a-z_]{1,22})|request)(=|[|%[a-z0-9]{0,2}) [NC,OR]

    Kannst du mir mehr dazu sagen was genau dieser Befehl tut, und weshalb dieser die Darstellung zerstört?

    Bei einer frischen wordpress installation passiert dies übrigens nicht. Heisst es muss mit irgendeinem Plugin oder einer Konfiguration in Konflikt geraten.

    Antworten
  • Hi,

    ich habe deinen Kommentar gelesen, jedoch wüsste ich nicht dass in den Einstellungen des Webhosters eine force www option gäbe.

    Die URL Ansich ist dort bereits mit https://www. hinterlegt.

    Das weiterleiten auf https://www. funktioniert ja auch wenn die domain ganz gewöhnlich geöffnet wird in allen varianten. (mit und ohne www, mit und ohne https).

    Jedoch bei einer direkten Eingabe einer Bild URL in die Browser Adressleiste, funktioniert dies leider nicht.

    http://domain.com/bild.jpg -> https://domain.com/bild.jpg
    https://domain.com/bild.jpg -> https://domain.com/bild.jpg

    Nur folgende variante wird zum gewünschten Ziel weitergeleitet:
    http://www.domain.com/bild.jpg -> https://www.domain.com/bild.jpg

    Oder verursacht dies kein Duplicate Content wenn sowohl mit und ohne www links/bilder geöffnet werden können?

    Übrigens scheint eine der Rules auch Schwierigkeiten mit Javascript zu verursachen.
    Die sidebar im backlink ist nicht mehr fixiert und bewegt sich beim scrollen nicht mit.

    Ebenfalls tauchen keine untermenus beim mouse over effect auf.
    Auch sucuri meldet dass zugriffe zu manchen .js dateien geblockt sei.

    /wp-content/plugins/revslider/public/assets/js/jquery.themepunch.revolution.min.js
    Unable to scan the page. 403 Forbidden

    /wp-content/plugins/revslider/public/assets/js/jquery.themepunch.tools.min.js
    Unable to scan the page. 403 Forbidden

    Habe bereits die Rules angeschaut konnte aber auf anhieb nichts finden, welches diese blockiert.

    Bevor ich nun jede Zeile einzeln entferne bis ich den Fehler finde, wäre ich dir sehr dankbar mir da kurz weiterzuhelfen, sofern dir der Fehler bekannt ist.

    Vielen Dank im Voraus und sorry wegen des Langen Textes, aber ich wollte dies gerne genauer Erläutern bezüglich des „force https with www“.

    Antworten
  • Hallo,

    leider wird jedoch die URL dann nicht zwingend über https://www. aufgerufen sondern auch über https:// (was zum duplicate content führt). Beispielsweise wenn eine Image URL ohne www. im browser geöffnet wird.

    Habe es nun mit Hilfe folgenden Rules hinbekommen, jedoch scheint sich dies sehr auf die Performance auszuwirken.
    Ich vermute es sind zuviele Abfragen welche gemacht werden? Möglicherweise kann man diese Rule irgendwie zusammenfassen?

    Ansonsten habe ich keine Möglichkeit gefunden zwingend https://www. verwenden zu können ohne eine solche Rule zu erstellen? Da hilft leider auch das hinterlegen der https://www. in den Einstellungen nicht.

    # ———————————————————————-
    # FORCE USING https://WWW.
    # ———————————————————————-

    RewriteEngine On
    RewriteCond %{HTTPS} =off [OR]
    RewriteCond %{HTTP_HOST} !^www. [OR]
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index.(html|php)
    RewriteCond %{HTTP_HOST} ^(www.)?(.+)$
    RewriteRule ^(index.(html|php))|(.*)$ https://www.%2/$3 [R=301,L]

    Antworten
    • Andreas Hecht
      4. März 2019 20:50

      Hast Du meinen Kommentar überhaupt gelesen?
      Ich zitiere mich mal:

      Zudem noch in den Einstellungen Deines Webhosters.

      Punkt.

      Antworten
  • Danke nochmals!

    Mir ist gerade aufgefallen dass wenn ich mein backend über http://www.beispiel.com/wp-admin

    aufrufe, diese zu folgender URL weitergeleitet wird:

    https://www.www.beispiel.com/wp-admin

    Das Problem besteht nur in der Kombination, bei der http://www. am Anfang sowie /wp-admin am Ende der URL steht.

    Da ich generell das www in meiner Domain nutze, habe ich dafür lediglich folgende Zeile bearbeitet:

    RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

    Ich vermute dass dies so nicht funktioniert und ggf. auch weitere Zeilen bearbeitet / eingefügt werden müssen?

    Ebenfalls möchte ich gerne erreichen dass jede URL auf https://www. weitergeleitet wird, sprich auch wenn links zu images direkt per http:// oder http://www. oder https:// geöffnet werden.

    Dies hatte ich zuvor mit anderen Rules hinbekommen, funktioniert aber in der Zusammenstellung mit deinen htaccess Rules leider nicht 🙁

    Übrigens, ich gehe davon aus, dass es sich bei folgender Zeile um blockierte user agents handelt? Genügt es hier |ahrefs| zu entfernen um den crawler wieder zu zulassen?

    RewriteCond %{HTTP_USER_AGENT} (360Spider|acapbot|acoonbot|ahrefs| ….

    Nochmals vielen Dank im Voraus!

    Antworten
    • Andreas Hecht
      4. März 2019 19:52

      Hi,

      nicht im Code der Datei herumfummeln. Das geht immer schief. Der betreffende Code-Teil ist nur zur definitiven Umleitung von http auf https da. Die von Dir gewünschte Domain stellst Du unter »Einstellungen => Allgemein« ein. Zudem noch in den Einstellungen Deines Webhosters. Das war es dann.

      Antworten
  • Danke!

    Dann hat ggf mein hoster diese Regeln erstellt. Jedenfalls sind die oben genannten Rules nicht sinnvoll, könnten sogar die gesamte Konfiguration durcheinander bringen?

    Wegen des Settings bezüglich WebP mit Optimus. Ich habe diese deaktiviert und nutze stattdessen imagify. Was ist deiner Meinung nach sinnvoller?

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.

Bitte füllen Sie dieses Feld aus.
Bitte füllen Sie dieses Feld aus.
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren.

Menü
Teilen
Teilen
Teilen