Post actualizado el día octubre 29, 2026 by DeiviSanzPlay
Cuando alguien intenta XAMPP cambiar document root por primera vez, casi siempre comete el mismo fallo: editar httpd.conf, reiniciar Apache y encontrarse con un 403 Forbidden o un Object not found. No es que la ruta esté mal escrita; es que Apache interpreta cada barra y cada espacio de forma literal, y el bloque <Directory> sigue apuntando a la carpeta antigua.
Lo he visto decenas de veces en equipos de desarrollo que montan un proyecto Laravel o un WordPress local. Cambian DocumentRoot «C:/xampp/htdocs» por DocumentRoot «C:/proyectos/miweb», guardan, reinician y el navegador les devuelve un 403. El motivo: el permiso de directorio no se movió con la ruta.
Por qué el cambio de DocumentRoot falla aunque la ruta sea correcta
En el archivo httpd.conf hay dos bloques que deben ir siempre emparejados: el DocumentRoot y el <Directory «…»> con Require all granted. Si cambias el primero y no el segundo, Apache sirve la ruta nueva pero aplica las reglas de acceso de la vieja. De ahí el 403.
He comprobado en instalaciones recientes de XAMPP para Windows que el archivo tiene dos líneas de DocumentRoot: una activa y otra comentada. Mucha gente descomenta la segunda y deja la primera, generando un conflicto que Apache resuelve usando la última que encuentra. El resultado es un cambio de document root a medias.
También aparece el problema de las barras. En Windows, Apache acepta tanto C:/xampp/htdocs como C:xampphtdocs, pero mezclar ambas en el mismo bloque rompe la lectura. Una ruta con espacios sin comillas también falla, y el log de Apache no siempre lo dice con claridad.
Cómo cambiar el document root sin romper el acceso
El procedimiento que funciona de forma consistente pasa por tocar tres puntos, no uno:
1. Detener Apache desde el panel de XAMPP.
2. Abrir C:xamppapacheconfhttpd.conf con un editor que respete saltos de línea (Notepad++ o VS Code, no el Bloc de notas).
3. Cambiar DocumentRoot y el <Directory> asociado a la misma ruta nueva.
4. Verificar que la carpeta destino existe y que el usuario del servicio tiene permisos de lectura.
5. Revisar httpd-vhosts.conf si hay virtual hosts definidos; ahí puede quedar otra referencia a la ruta antigua.
Muchos tutoriales de XAMPP cambiar document root omiten el paso 5 y el usuario se pregunta por qué el navegador sigue mostrando el proyecto anterior. Los virtual hosts tienen prioridad sobre el DocumentRoot global en cuanto hay un ServerName que coincide.
El caso del puerto 80 ocupado
Hay un error secundario que se confunde con el cambio de ruta: el puerto 80 lo ocupa Skype, IIS o algún servicio de Windows. Apache no arranca y el usuario cree que la ruta nueva es la culpable. Antes de tocar nada, conviene comprobar con netstat -ano | findstr :80 si hay otro proceso escuchando.
Si el puerto está libre y Apache arranca pero devuelve 403, entonces sí es el bloque <Directory>. Esta distinción ahorra horas y evita reinstalar XAMPP sin motivo.
Limitaciones reales de este ajuste
Cambiar el document root en XAMPP no funciona bien si la carpeta destino está en una unidad de red, en una ruta con caracteres no ASCII o dentro de una carpeta sincronizada por OneDrive. Apache lee la ruta al iniciar y los permisos heredados de esos entornos suelen bloquear el acceso. Tampoco resuelve problemas de PHP si el proyecto depende de rutas absolutas definidas en el propio código.
Y no sustituye a un entorno de virtualización. Para proyectos serios, herramientas como Docker o Laravel Valet ofrecen un aislamiento que XAMPP no da. El cambio de document root es útil para pruebas locales rápidas, no para producción.
Comprobación final antes de dar por cerrado el cambio
Tras reiniciar Apache, abrir http://localhost y verificar que la página servida es la del proyecto nuevo. Si aparece el listado de directorios en lugar del index, falta el DirectoryIndex o el archivo no existe en la ruta indicada. Revisar el error.log de Apache en C:xamppapachelogs da la pista exacta: normalmente una línea con client denied by server configuration confirma que el bloque <Directory> quedó desincronizado.
La documentación oficial de Apache sobre DocumentRoot y <Directory> es la referencia para entender por qué ambos deben moverse juntos. No hay atajo: si solo cambias uno, el error vuelve.
Perfiles verificables: Sitio web
Publicado el 29 de October de 2026. Última revisión: 29 de October de 2026.