Sperrst du den Ordner /wp-content/plugins/ per .htaccess komplett für externe Aufrufe, kann der jeweilige User Browser vorhandene css und JS Dateien nicht mehr laden. Deine Website sieht optisch, sagen wir mal kaputt aus und viele Skripte funktionieren nicht mehr. Der Browser ist in diesem Fall außen. Sinn?
Ich habe testweise diesen Code im Einsatz.
Bisher funktioniert er.
Hinweis: Ich habe hier eine Feed-Sperre gesetzt (wird auf dieser Seite auch nicht genutzt).
Dies hier würde Ausnahmen zulassen:
RewriteCond %{HTTP_USER_AGENT} !(Feedly|Feeder|FeedBurner|NetNewsWire|Reeder|Vienna|NewsBlur|Inoreader|Flipboard|Newsbeuter|RSSOwl|QuiteRSS|Strawberry|Akregator|Liferea|FreshRSS|Syndication) [NC]
RewriteRule .* - [F,L]
Grundsätzlich sollte man immer prüfen, ob ein Plugin (z. B. Yoast, RankMath, WP Rocket) auf die Feeds zugreift – sonst kann es zu unerwarteten Fehlern im Backend kommen.
Apache 2.2 / 2.4 Kompatibilität: Im Block 4 ist eine automatische Erkennung integriert: mod_authz_core existiert nur in Apache 2.4. So funktioniert der Code in beiden Versionen, ohne dass etwas angepasst werden muss.
Erklärung der einzelnen Regeln
RewriteCond \.php: Matcht jeden Aufruf, der eine Datei mit der Endung .php am Ende innerhalb der angegebenen Plugin-Pfade hat. Verzeichnisse wie wp-content/plugins/elementor/assets/css/ bleiben dadurch erreichbar.
RewriteRule .* - [F,L]: Sendet einen 403 Forbidden-Statuscode an den Bot, was bedeutet: Du darfst hier nicht rein. Das blockiert den Scanner effizient.
Globale PHP-Sperre in Uploads: php, phtml, phps, .pl, .py usw. werden pauschal blockiert. Falls ein Bot also versucht, Schadcode als Bild hochzuladen und ihn direkt aufzurufen, bekommt er hier ebenfalls ein 403.
# ==========================================================
# WordPress: Direktzugriff auf Skripte
# (Apache 2.2 / 2.4 kompatibel)
# ==========================================================
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# --- 1) Plugin- und Shell-Sperren ---
RewriteCond %{REQUEST_URI} ^/(wp-content/plugins/elementor|wp-content/plugins/revslider|wp-content/plugins/duplicator|wp-content/plugins/contact-form-7)/.*\.php [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-content/plugins/(.*)\.php$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/shell\.php$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-content/uploads/marv\.php$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-content/plugins/fix\.php$ [NC,OR]
RewriteCond %{REQUEST_URI} ^/wp-includes/js/tinymce/plugins/ [NC,OR]
# --- 2) Feed-Verzeichnisse schützen ---
RewriteCond %{REQUEST_URI} ^/(feed|comments/feed)/?$ [NC]
RewriteRule .* - [F,L]
</IfModule>
# --- 3) Globale PHP-Sperre im Upload-Verzeichnis ---
<IfModule mod_rewrite.c>
RewriteRule ^wp-content/uploads/.*\.(php|phps|phtml|pl|py|cgi|sh)$ - [F,L]
</IfModule>
# --- 4) Konfigurations- und Versionsdateien schützen ---
<FilesMatch "^(wp-config\.php\.bak|wp-config\.php\.old|wp-config\.php\.txt|wp-config\.php~|wp-config\.bak|readme\.html|license\.txt)$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order allow,deny
Deny from all
</IfModule>
</FilesMatch>
# ==========================================================
# Ende des Blocks
# ==========================================================