Si visitas la URL de una carpeta en tu sitio, por ejemplo https://tudominio.com/wp-content/uploads/2024/, ocurre una de estas tres cosas. Ves una página blanca limpia de WordPress (porque index.php toma el control), ves una página "403 Forbidden" o ves algo que parece un navegador de FTP: una lista de todos los archivos de esa carpeta, con tamaños y marcas de tiempo. La tercera es el problema del que trata esta guía.
El listado de directorios (también llamado "directory browsing" o "directory indexing") es una característica del servidor web que genera automáticamente un índice HTML cuando no se encuentra ningún index.html o index.php en una carpeta. En un sitio estático eso resulta útil de vez en cuando. En un sitio WordPress es casi siempre una fuga de información. Esta guía explica qué se filtra concretamente, por qué importa y cómo deshabilitar correctamente esta característica en Apache, nginx y los distintos hostings gestionados de WordPress.
¿Qué se filtra realmente cuando el listado de directorios está habilitado?
La mayoría de las carpetas de WordPress contienen al menos un archivo que resulta interesante para un atacante, un competidor o simplemente un visitante curioso. Los peores casos realistas:
/wp-content/uploads/contiene todos los archivos multimedia que se han subido alguna vez, organizados por año y mes. Con el listado habilitado, cualquiera puede ver PDFs que se "desvincularon" pero nunca se eliminaron, borradores de imágenes, documentos de clientes y cualquier archivo privado que un editor subió pensando que una "URL poco evidente" era protección suficiente./wp-content/plugins/revela la lista exacta de plugins instalados en el sitio, incluidos los que se desactivaron pero no se eliminaron. Es una lista de la compra de vulnerabilidades muy precisa para cualquier escáner./wp-content/backup/,/backups/,/wp-content/uploads/backups/y carpetas similares son destinos típicos para los plugins de copias de seguridad. Si el listado está activado, los volcados completos de la base de datos y las copias del sitio comprimidas pasan a ser descargables directamente.- Las carpetas de temas a menudo contienen versiones antiguas de
style.css, archivos SCSS sobrantes, páginas de prueba ocultas y notas de desarrollador que nunca debían ser públicas. - Las carpetas de la raíz del sitio pueden mostrar
wp-config.php.bak, archivos de intercambio de editores (.swp), directorios.git/de un despliegue chapucero y restos similares de limpieza pendiente.
Los archivos sensibles en esas carpetas suelen estar ahí porque alguien los subió rápidamente, pensaba eliminarlos más tarde y se olvidó. Mientras la carpeta no liste su contenido, nadie los encuentra. En el momento en que el listado se habilita, cada URL de esas carpetas está a un clic de ser indexada por un motor de búsqueda o recolectada por un escáner.
Cómo comprobar si el listado de directorios está habilitado en tu sitio
La prueba más rápida lleva diez segundos. Abre estas URLs en una ventana privada del navegador:
https://tudominio.com/wp-content/https://tudominio.com/wp-content/uploads/https://tudominio.com/wp-content/plugins/https://tudominio.com/wp-includes/
Lo que quieres ver es una página 403 Forbidden o, en el caso de /wp-content/, una página en blanco (es el index.php vacío de WordPress haciendo su trabajo). Lo que no quieres ver es una lista de archivos. Si la ves, el listado está activado para esa carpeta. InspectWP también realiza esta comprobación en cada análisis y marca las carpetas afectadas en la sección de seguridad.
Opción 1: Deshabilitar el listado de directorios en Apache (y LiteSpeed)
La directiva de Apache que controla este comportamiento se llama Options, con el valor Indexes activando el listado y Options Indexes negándose escribiéndolo sin un signo más al principio, más un signo menos en la propia directiva. Añade lo siguiente al archivo .htaccess en el directorio raíz de tu WordPress, encima del marcador # BEGIN WordPress:
Options -IndexesEsa única línea deshabilita el listado para toda la instalación de WordPress de una sola vez. Se aplica a todas las carpetas bajo el document root, salvo que una regla más específica la sobrescriba más abajo en el árbol.
Si tu host bloquea por completo Options en .htaccess (algunos hostings compartidos lo hacen por motivos de rendimiento), tienes dos alternativas:
- Coloca un
index.phpoindex.htmlvacío en cada carpeta que quieras blindar. WordPress ya lo hace para/wp-content/,/wp-content/plugins/y unas cuantas más, pero no para/wp-content/uploads/. El archivo vacío hace que Apache sirva ese archivo en lugar de listar la carpeta. - Pide a tu host que habilite la directiva
Optionspara tu cuenta. La mayoría de los hosts gestionados lo hacen a petición.
El truco del index.php es sencillo, pero es fácil equivocarse: tienes que acordarte de añadir el archivo a cada carpeta nueva que se cree, incluidas las carpetas de año/mes que WordPress crea automáticamente para las nuevas subidas. Una regla del servidor web no tiene ese problema.
Opción 2: Deshabilitar el listado de directorios en nginx
En nginx, el listado de directorios se controla con la directiva autoindex. Por defecto está en off en la mayoría de las instalaciones, así que en una configuración de nginx por defecto el problema no existe. Las carpetas que visitas caen en un 403 cuando no hay archivo de índice presente.
Si el listado está activado, alguien lo activó explícitamente en algún momento. Busca autoindex on; en tu nginx.conf, en el bloque server del sitio, o en cualquier archivo conf.d incluido. Elimina la línea o cámbiala a:
autoindex off;Recarga nginx con sudo nginx -t && sudo systemctl reload nginx. La siguiente petición de carpeta recibirá un 403 en lugar de una lista de archivos.
Si no puedes recargar nginx (hosting gestionado bloqueado), el mismo truco del index.php de la sección de Apache también funciona en nginx, porque nginx servirá encantado un archivo de índice existente antes de recurrir al autoindex.
Opción 3: Hosting gestionado de WordPress
Los hosts gestionados (Raidboxes, Kinsta, WP Engine, Cloudways, Pressable, etc.) suelen deshabilitar el listado de directorios por defecto a nivel de servidor. Si descubres que uno de estos hosts tiene el listado habilitado en tu cuenta, lo correcto es abrir un ticket de soporte rápido. Tienen acceso a la configuración central de nginx y pueden corregirlo en minutos. Intentar solucionarlo desde dentro de WordPress en un host gestionado raramente merece la pena.
Ten en cuenta que algunos hosts utilizan una capa de CDN (Cloudflare, KeyCDN, Bunny) que cachea las peticiones de carpetas. Si cambias la configuración del servidor y sigues viendo una lista de archivos, puede que la CDN esté sirviendo una versión cacheada. Purga la caché para las rutas afectadas y vuelve a probar.
Error habitual: proteger wp-content/uploads con .htaccess
Un patrón que aparece en guías antiguas es poner un .htaccess aparte directamente en wp-content/uploads/ con una larga lista de reglas. La intención es buena, pero los efectos secundarios son liosos: dependiendo de lo que contengan las reglas, las imágenes pueden dejar de cargarse, el lazy loading puede romperse o los PDFs pueden volverse inaccesibles. Si solo quieres deshabilitar el listado, la única línea Options -Indexes en el .htaccess raíz es suficiente. Se aplica de forma recursiva. No hay necesidad de archivos separados por carpeta salvo que tengas una razón específica.
¿Y ocultar también los archivos a los motores de búsqueda?
Deshabilitar el listado de directorios evita que se sirva el índice de la carpeta, pero no impide que un motor de búsqueda indexe archivos individuales dentro de la carpeta si están enlazados desde algún sitio en la web pública. Si tienes archivos sensibles en wp-content/uploads/ que no quieres que aparezcan en Google, eliminar el archivo es la única respuesta fiable. Las metaetiquetas noindex, las cabeceras X-Robots-Tag y las entradas en robots.txt ayudan con la detección, pero solo borrar el archivo garantiza que el contenido haya desaparecido.
La regla general que siempre se aplica a la carpeta uploads: no subas allí nada que no te resulte cómodo ver en la portada de tu sitio. La carpeta es un directorio web público por diseño.
Cómo verificar tu configuración
- Abre
https://tudominio.com/wp-content/uploads/en una ventana privada del navegador. Resultado esperado: una página403 Forbiddeno una página en blanco (según haya o no unindex.htmlvacío presente). - Repite la comprobación con cualquier otra carpeta que hayas encontrado antes (
/wp-content/plugins/, carpetas de temas, carpetas de subida personalizadas). - Si ves una lista de archivos, el cambio no ha surtido efecto. Comprueba que has editado el
.htaccesscorrecto (el de la raíz de WordPress, no el del directorio padre de la instalación de WordPress) y purga cualquier capa de caché. - Lanza un nuevo análisis de InspectWP. La comprobación "listado de directorios habilitado" en la sección de seguridad debería estar en verde.
Todo el cambio es una sola línea en .htaccess en Apache, o un único ajuste de configuración en nginx. Cinco segundos de trabajo y desaparece toda una clase de exposición accidental de archivos. Vale la pena hacerlo en cada sitio, aunque ahora mismo todo lo que haya en tu carpeta de uploads esté bien. La protección es para el siguiente archivo que alguien suba con prisa, no solo para los que ya están ahí.