Ein 500 Internal Server Error bei der WordPress-REST-API gehört zu den frustrierendsten Fehlerbildern: Der Block-Editor lädt nicht mehr, Inhalte lassen sich nicht speichern, und der Website-Zustand meldet kryptische REST-Fehler – oft ohne verwertbare Logs.
Das Problem dabei: Ein 500-Fehler ist kein einzelner Fehler, sondern ein Sammelsymptom.
Die Ursache kann überall liegen – von Permalinks und Rewrite-Regeln über Plugins, Themes und PHP-Inkompatibilitäten bis hin zu Hosting-, WAF- oder Proxy-Konfigurationen. Viele Anleitungen nennen nur „die wahrscheinlichsten“ Ursachen. In der Praxis reicht das oft nicht.
Die folgende Checkliste ist daher bewusst unpriorisiert aufgebaut. Sie dient als systematisches Debug-Werkzeug, mit dem sich REST-API-Fehler reproduzierbar eingrenzen lassen – von banalen Konfigurationsproblemen bis zu seltenen Edge-Cases.
Ideal für alle, die WordPress-Fehler nicht erraten, sondern sauber diagnostizieren wollen.
0 – Vorbereitung: Debug-Modus aktivieren
Bevor du irgendetwas testest, schalte die Fehlerausgabe ein. Ohne Logs ist jede Diagnose Raten.
In der wp-config.php:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
define( 'SCRIPT_DEBUG', true );
Die Logdatei findest du unter wp-content/debug.log. Zusätzlich: PHP-Error-Log des Servers prüfen (Pfad je nach Hoster, oft unter /var/log/ oder im Hosting-Panel).
Tipp: Teste REST-Endpunkte direkt im Browser oder mit curl, um Frontend-Einflüsse auszuschließen:
curl -v https://example.com/wp-json/wp/v2/posts
Checkliste: Systematische Fehlersuche
✅ 1 – Permalinks zurücksetzen
| Was | Wie |
|---|---|
| Symptom | REST-Routen liefern 404 oder 500, obwohl WordPress funktioniert |
| Aktion | Einstellungen → Permalinks → Änderungen speichern (ohne etwas zu ändern) |
| Warum | Schreibt die .htaccess / Rewrite-Regeln neu. Häufigste Ursache nach Migrationen oder Updates. |
Falls das nicht hilft: .htaccess manuell prüfen. Standard-WordPress-Block:
# 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
Alles außerhalb dieses Blocks ist potenziell verdächtig.
✅ 2 – Alle Plugins deaktivieren
| Was | Wie |
|---|---|
| Symptom | 500 tritt nur bei bestimmten Endpunkten oder nach Plugin-Update auf |
| Aktion | Alle Plugins deaktivieren → REST-API testen → einzeln reaktivieren |
| Schnellweg | Per FTP/SSH: wp-content/plugins → umbenennen in plugins_off |
# WP-CLI Variante
wp plugin deactivate --all
wp plugin activate plugin-name # einzeln reaktivieren
Häufige Übeltäter:
- Security-Plugins (Wordfence, iThemes Security, Sucuri)
- Caching-Plugins (WP Rocket, LiteSpeed Cache, W3 Total Cache)
- REST-API-modifizierende Plugins (Disable REST API, Custom Endpoints)
- Page Builder mit eigenen API-Routen
✅ 3 – Theme auf Standard wechseln
| Was | Wie |
|---|---|
| Symptom | 500 verschwindet nach Plugin-Deaktivierung nicht |
| Aktion | Auf Twenty Twenty-Four (oder aktuelles Default-Theme) wechseln |
| Schnellweg | wp theme activate twentytwentyfour |
Themes können über functions.php oder rest_api_init-Hooks die API beeinflussen. Besonders bei Custom Themes mit eigenen Endpunkten.
✅ 4 – PHP-Version und Limits prüfen
| Prüfpunkt | Empfehlung |
|---|---|
| PHP-Version | Mindestens 8.0, empfohlen 8.2+ |
| memory_limit | Mindestens 256M |
| max_execution_time | Mindestens 120 |
| post_max_size | Mindestens 64M |
| upload_max_filesize | Mindestens 64M |
In wp-config.php:
define( 'WP_MEMORY_LIMIT', '256M' );
define( 'WP_MAX_MEMORY_LIMIT', '512M' );
In php.ini oder .user.ini:
memory_limit = 256M
max_execution_time = 120
post_max_size = 64M
Prüfen:
wp eval "phpinfo();" | grep -E "memory_limit|max_execution|post_max"
# oder im Browser:
# https://example.com/wp-json/ → Liefert der Index-Endpunkt eine Antwort?
✅ 5 – WordPress-Core-Dateien prüfen
| Was | Wie |
|---|---|
| Symptom | 500 nach Core-Update oder nach Hack-Verdacht |
| Aktion | Core-Dateien auf Integrität prüfen |
wp core verify-checksums
Bei Abweichungen:
wp core download --force --skip-content
✅ 6 – Datenbank-Probleme ausschließen
| Was | Wie |
|---|---|
| Symptom | Sporadische 500er, langsame Antworten, Timeout-Fehler |
| Aktion | Datenbank reparieren und optimieren |
In wp-config.php temporär:
define( 'WP_ALLOW_REPAIR', true );
Dann aufrufen: https://example.com/wp-admin/maint/repair.php
# WP-CLI
wp db repair
wp db optimize
Prüfe auch die wp_options-Tabelle auf aufgeblähte autoload-Einträge:
SELECT LENGTH(option_value) as size, option_name
FROM wp_options
WHERE autoload = 'yes'
ORDER BY size DESC
LIMIT 20;
✅ 7 – Server-Konfiguration: mod_security / WAF
| Was | Wie |
|---|---|
| Symptom | 500 nur bei POST/PUT-Requests, bei bestimmten Inhalten oder sporadisch |
| Aktion | mod_security-Logs prüfen, WAF-Regeln testen |
Typische Auslöser:
- Inhalte mit
<script>,<iframe>oder SQL-ähnlichen Strings - Große POST-Bodys
- Bestimmte User-Agents
Temporär in .htaccess testen:
<IfModule mod_security2.c>
SecRuleEngine Off
</IfModule>
⚠️ Nur zum Testen! Danach sofort wieder aktivieren.
Bei Cloudflare, Sucuri oder anderen externen WAFs: Regeln im Dashboard prüfen, ggf. REST-API-Pfade whitelisten.
✅ 8 – Reverse Proxy / Load Balancer
| Was | Wie |
|---|---|
| Symptom | 500 nur in Produktion, nicht lokal. Oder: REST liefert HTML statt JSON |
| Aktion | Proxy-Header und Weiterleitungen prüfen |
Häufige Probleme:
- Nginx vor Apache:
try_filesleitet/wp-json/nicht korrekt weiter - Cloudflare Proxy: Timeout bei langen Requests
- Varnish Cache: Cached fehlerhafte Antworten
Nginx-Fix für REST-API:
location /wp-json/ {
try_files $uri $uri/ /index.php?$args;
}
✅ 9 – SSL / Mixed Content
| Was | Wie |
|---|---|
| Symptom | REST-API funktioniert über HTTP, aber nicht über HTTPS (oder umgekehrt) |
| Aktion | siteurl und home in wp_options prüfen |
wp option get siteurl
wp option get home
Beide müssen identisch sein und das korrekte Protokoll verwenden. Mismatch = Redirect-Loop = 500.
✅ 10 – REST-API gezielt testen
Teste verschiedene Endpunkte, um den Fehler einzugrenzen:
# Basis-Check: API erreichbar?
curl -s https://example.com/wp-json/ | head -20
# Öffentlicher Endpunkt (kein Auth nötig)
curl -s https://example.com/wp-json/wp/v2/posts
# Authentifizierter Endpunkt
curl -s -u admin:APPLICATION_PASSWORD https://example.com/wp-json/wp/v2/users/me
# POST-Request testen
curl -X POST https://example.com/wp-json/wp/v2/posts -u admin:APPLICATION_PASSWORD -H "Content-Type: application/json" -d '{"title":"Test","status":"draft"}'
# Spezifischer Plugin-Endpunkt
curl -s https://example.com/wp-json/wp-site-health/v1/tests/dotorg-communication
Auswertung:
| Ergebnis | Deutet auf |
|---|---|
| Alle Endpunkte 500 | Server-/Core-Problem |
| Nur POST/PUT 500 | WAF / mod_security / Body-Size-Limit |
| Nur bestimmte Routen 500 | Plugin-/Theme-spezifisch |
| Nur mit Auth 500 | Auth-Plugin oder User-bezogenes Problem |
| Nur sporadisch 500 | Ressourcen-Limit, DB-Lock, Caching |
✅ 11 – Cron und REST-API-Abhängigkeiten
| Was | Wie |
|---|---|
| Symptom | 500 bei Loopback-Requests, Site Health meldet Fehler |
| Aktion | Loopback-Verbindung testen |
# Kann der Server sich selbst erreichen?
wp eval "var_dump(wp_remote_get(rest_url()));"
Häufig bei:
- Hosts, die Loopback blockieren
- Falsche DNS-Auflösung (z. B. bei Staging-Domains)
ALTERNATE_WP_CRONaktiv, aber REST blockiert
✅ 12 – Object Cache / Redis / Memcached
| Was | Wie |
|---|---|
| Symptom | 500 nach Cache-Änderung oder sporadisch |
| Aktion | Object Cache leeren oder object-cache.php temporär entfernen |
wp cache flush
# oder
mv wp-content/object-cache.php wp-content/object-cache.php.bak
Entscheidungsübersicht: Schnelle Eingrenzung
REST-API liefert 500
│
├─ Tritt der Fehler bei ALLEN Endpunkten auf?
│ ├─ JA → Permalinks zurücksetzen (#1)
│ │ → .htaccess / Nginx prüfen (#1, #8)
│ │ → PHP-Fehlerlog prüfen (#0)
│ │ → Core-Dateien prüfen (#5)
│ │
│ └─ NEIN → Welche Endpunkte sind betroffen?
│ ├─ Plugin-Endpunkte → Plugin deaktivieren (#2)
│ ├─ Nur POST/PUT → WAF / mod_security (#7)
│ └─ Nur mit Auth → Auth-Plugin / Cookies (#2, #10)
│
├─ Tritt der Fehler nur in Produktion auf?
│ ├─ JA → Proxy / CDN / WAF prüfen (#7, #8)
│ └─ NEIN → Lokales Problem: PHP, Plugins, Theme (#2–#6)
│
├─ Tritt der Fehler sporadisch auf?
│ ├─ JA → Ressourcen-Limits (#4)
│ │ → Datenbank (#6)
│ │ → Object Cache (#12)
│ └─ NEIN → Reproduzierbar = gezielt testbar (#10)
│
└─ Fehler nach Update aufgetreten?
├─ Core-Update → Checksums prüfen (#5)
├─ Plugin-Update → Plugin isolieren (#2)
├─ PHP-Update → Kompatibilität prüfen (#4)
└─ Hosting-Änderung → Server-Config prüfen (#7, #8)
Handlungsempfehlungen nach Diagnose
| Ursache gefunden | Empfohlene Maßnahme |
|---|---|
| Permalinks / .htaccess | Neu speichern; bei Custom Rules: dokumentieren und versionieren |
| Plugin-Konflikt | Plugin-Autor kontaktieren, Alternative suchen, oder Konflikt im Support-Forum melden |
| Theme-Problem | Child-Theme verwenden, functions.php-Hooks isolieren |
| PHP-Version | Upgrade planen, vorher Kompatibilität mit PHP Compatibility Checker testen |
| Speicher-/Zeitlimits | Hosting-Paket prüfen; bei Shared Hosting: Upgrade auf Managed WordPress |
| WAF / mod_security | Regeln gezielt anpassen, nicht pauschal deaktivieren; REST-Pfade whitelisten |
| Proxy / CDN | Cache-Regeln für /wp-json/* anpassen; API-Pfade vom Caching ausschließen |
| Datenbank | Regelmäßige Optimierung einplanen; autoload-Bloat überwachen |
| Object Cache | Drop-In aktuell halten; bei Problemen: Redis/Memcached-Verbindung prüfen |
| Core-Dateien beschädigt | Neu installieren via wp core download --force --skip-content |
Fazit
Ein 500-Fehler der REST-API ist kein Grund zur Panik – aber auch kein Problem, das sich mit einem einzelnen Tipp lösen lässt. Die systematische Vorgehensweise über diese Checkliste stellt sicher, dass keine Ursache übersehen wird.
Drei Grundregeln für die Praxis:
- Immer zuerst Logs aktivieren – ohne
WP_DEBUG_LOGund Server-Error-Log ist jede Diagnose Zufall. - Isolieren statt raten – Plugins einzeln testen, Endpunkte gezielt ansprechen, Umgebungen vergleichen.
- Dokumentieren – Halte fest, was du getestet hast und was das Ergebnis war. Das spart Zeit beim nächsten Mal und hilft im Support-Fall.
Hast du einen Edge-Case gefunden, der hier fehlt? Schreib ihn in die Kommentare – diese Checkliste wird laufend erweitert.




