Error 403 en wp-admin de WordPress en load-styles.php / load-scripts.php (Wordfence WAF / auto_prepend_file)
Resumen
Tras una actualización de WordPress o de un complemento, algunos sitios muestran de repente una pantalla de wp-admin dañada:
- El inicio de sesión funciona, pero el panel de administración aparece sin estilos, en blanco o cargado a medias.
- Las herramientas para desarrolladores del navegador → Red muestran 403 Forbidden para:
wp-admin/load-styles.phpwp-admin/load-scripts.php
- Deshabilitar los complementos desde wp-admin, o incluso cambiar el nombre de
wp-content/plugins, no no soluciona el error 403.
En muchos casos, la causa root es el firewall de aplicaciones web de Wordfence (WAF) se sigue cargando mediante auto_prepend_file en .htaccess y/o .user.ini, incluso después de deshabilitar el complemento.
Síntomas
- El administrador de WordPress se carga parcialmente o sin CSS/JS.
- En la pestaña Red de las herramientas para desarrolladores de su navegador →:
wp-admin/load-styles.phpy/owp-admin/load-scripts.phpmuestran 403 Forbidden.
- El registro de errores de Apache muestra líneas similares a:
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-styles.php [authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-scripts.php - Cambiar el nombre de
wp-content/pluginso desactivar los plugins desde el panel de control no no soluciona el error.
Causa raíz
Cuando Wordfence WAF está activado en modo Extended Protection no se comporta como un plugin normal de WordPress. Además, se inyecta en PHP mediante auto_prepend_file.
En concreto, Wordfence:
- Añade una
auto_prepend_filedirectiva a la configuración de PHP mediante:.htaccess(Apache).user.ini(configuración de PHP por directorio)
- Hace que esa directiva apunte a un archivo de arranque como:
# In .htaccess php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php; In .user.ini auto_prepend_file = "/home/USER/public_html/wordfence-waf.php"
Esto obliga a que cada solicitud PHP (frontend, wp-admin, AJAX, cron, etc.) cargue wordfence-waf.php antes del WordPress. Incluso si desactiva o elimina el plugin Wordfence, el arranque del WAF puede seguir:
- Bloqueando rutas específicas (p. ej.
load-styles.php,load-scripts.php,wp-cron.php), o - Fallando por código obsoleto o incompatible tras una actualización de WordPress o PHP.
Dado que esto se ejecuta a nivel de PHP / Apache, no basta con desactivar el plugin en wp-admin.
Cómo confirmar que se trata de Wordfence / auto_prepend_file
1. Revise los registros de errores de Apache / PHP
Busque en el registro de errores de su host virtual o en el registro global de errores de Apache líneas como las siguientes:
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-styles.php
[authz_core:error] AH01630: client denied by server configuration: /home/USER/public_html/wp-admin/load-scripts.php
Si observa errores 403 en estos endpoints principales de WordPress y desactivar los plugins de la forma habitual no soluciona el problema, sospeche de WAF / auto_prepend_file.
2. Revise .user.ini en el document root
- Mediante SSH o el administrador de archivos, diríjase al directorio root de su sitio (por ejemplo
/home/USER/public_html). - Abra
.user.iniy busque una línea similar a esta:auto_prepend_file = "/home/USER/public_html/wordfence-waf.php"
3. Revise .htaccess para Wordfence WAF
- En el mismo directorio, abra
.htaccess. - Busque un bloque de Wordfence WAF, por ejemplo:
# Wordfence WAF # <IfModule mod_php7.c> php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php # </IfModule>
Si existen, Wordfence WAF se sigue inyectando en cada solicitud PHP, incluso aunque el plugin esté desactivado.
Solución: desinstalar correctamente Wordfence WAF
Advertencia: Haga esto solo si desea desactivar Wordfence WAF. Si aún desea utilizar Wordfence, emplee su propia interfaz para reconfigurar la protección extendida.
Paso 1: desactive el plugin Wordfence (si es posible)
- Inicie sesión en wp-admin.
- Vaya a Plugins → Plugins instalados.
- Desactivar Wordfence Security.
Si wp-admin no funciona en absoluto, puede omitir este paso y pasar directamente a la edición de los archivos.
Paso 2: elimine auto_prepend_file de .user.ini
- En el document root de su sitio WordPress, abra
.user.ini. - Busque la línea de Wordfence:
auto_prepend_file = "/home/USER/public_html/wordfence-waf.php" - Coméntela o elimínela, por ejemplo:
; auto_prepend_file = "/home/USER/public_html/wordfence-waf.php" - Guarde el archivo.
Paso 3: Eliminar auto_prepend_file de .htaccess
- En el mismo directorio, abra
.htaccess. - Busque el bloque del WAF de Wordfence, por ejemplo:
# Wordfence WAF <IfModule mod_php7.c> php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php </IfModule> - Coméntelo o elimínelo:
# Wordfence WAF disabled # <IfModule mod_php7.c> # php_value auto_prepend_file /home/USER/public_html/wordfence-waf.php # </IfModule> - Guarde el archivo.
Paso 4: Borrar la caché de opcode / reiniciar PHP (opcional, pero recomendable)
- Si utiliza PHP-FPM / LSAPI / FastCGI, reinicie PHP-FPM o LiteSpeed / Apache.
- También puede solicitar a su proveedor de hosting que borre la opcache de PHP de esa cuenta.
Paso 5: Probar wp-admin
- Abra
/wp-admin/en su navegador. - Abra DevTools → Network y, a continuación, recargue la página.
- Compruebe que:
wp-admin/load-styles.phpdevuelve 200 OK.wp-admin/load-scripts.phpdevuelve 200 OK.- La interfaz de administración vuelve a verse con normalidad (CSS/JS cargados).
Si anteriormente añadió alguna regla de anulación temporal (por ejemplo, un wp-admin/.htaccess que permitía incondicionalmente esos archivos), puede eliminarla cuando todo funcione con normalidad.
Opcional: limpieza de los archivos de Wordfence
Si ya no va a utilizar Wordfence en absoluto, también puede:
- Eliminar o renombrar:
wp-content/plugins/wordfence/wp-content/wflogs/(directorio de registros)
- Eliminar
wordfence-waf.phpde su document root si ya no se hace referencia a él en ningún lugar.
Cómo evitar problemas en el futuro
- Tenga en cuenta que los plugins de seguridad con WAF / “Protección extendida” pueden modificar:
.htaccess.user.ini- El comportamiento global de PHP mediante
auto_prepend_file
- Desactivar el plugin desde el panel de control no no eliminan automáticamente estos ganchos de bajo nivel.
- Si observa errores 403 extraños o el mensaje “client denied by server configuration” en archivos principales de WordPress como
load-styles.php,load-scripts.php, owp-cron.php, compruebe siempre si hay:auto_prepend_filelíneas en.user.inicomo la.htaccess.- Archivos de arranque del WAF sobrantes, como
wordfence-waf.php.
Resumen
Problema: El panel de administración de WordPress no funciona: load-styles.php / load-scripts.php devuelve un error 403, incluso después de desactivar los plugins.
Causa: El WAF de Wordfence sigue inyectándose a través de auto_prepend_file en .htaccess / .user.ini, cargando wordfence-waf.php en cada solicitud y bloqueando esos endpoints.
Solución:
- Desactive el plugin Wordfence (si es posible).
- Eliminar
auto_prepend_filereferencias awordfence-waf.phpde.htaccesscomo la.user.ini. - Recargue PHP / Apache y vuelva a probar wp-admin — los errores 403 en
load-styles.php/load-scripts.phpdeberían desaparecer.