Post actualizado el día octubre 29, 2026 by DeiviSanzPlay
Configurar virtual host XAMPP suele fallar por un motivo que casi nadie menciona: Apache carga primero el archivo httpd-vhosts.conf desde una ruta que tú no estás editando. Abres httpd.conf, añades tu bloque <VirtualHost *:80>, reinicias y sigues viendo el 403 o el famoso «It works!». El proyecto está bien; la directiva Include apunta a otro sitio.
Antes de tocar nada, comprueba en httpd.conf la línea que empieza por Include conf/extra/httpd-vhosts.conf. Si está comentada con #, ningún virtual host funcionará aunque lo hayas escrito perfecto. Ese es el primer punto donde se rompe la configuración de virtual host en XAMPP.
El bloque mínimo que sí funciona en httpd-vhosts.conf
Con el Include activo, edita C:xamppapacheconfextrahttpd-vhosts.conf. Un ejemplo real para un proyecto llamado tienda:
<VirtualHost *:80> ServerName tienda.local DocumentRoot «C:/xampp/htdocs/tienda/public» <Directory «C:/xampp/htdocs/tienda/public»> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>Fíjate en tres detalles que provocan el 90% de los errores al configurar virtual host XAMPP: barras normales en Windows, Require all granted (Apache 2.4 cambió la sintaxis respecto a 2.2) y AllowOverride All si usas Laravel, WordPress o cualquier CMS con .htaccess.
Sin AllowOverride All, las URLs amigables devuelven 404 aunque el virtual host esté bien definido. Me ha pasado con instalaciones de WordPress donde el home cargaba pero cualquier enlace interno fallaba.
hosts, DNS y el detalle que se olvida
El segundo punto crítico al configurar virtual host XAMPP está en C:WindowsSystem32driversetchosts. Añade:
127.0.0.1 tienda.localSin esta línea, el navegador no sabe resolver tienda.local y te lanzará un error de DNS. No es un problema de Apache, es resolución de nombres. Editar el archivo requiere permisos de administrador; Notepad normal no podrá guardar.
Un matiz que casi nadie comenta: si usas IPv6 en Windows, algunos navegadores intentan ::1 antes que 127.0.0.1. Añadir también ::1 tienda.local evita latencias raras de varios segundos en la primera carga.
El conflicto con el vhost por defecto
XAMPP trae un virtual host de ejemplo apuntando a htdocs. Si defines el tuyo después, Apache lo respeta, pero si lo pones antes, el primero gana como default. Muchos tutoriales omiten que el orden importa cuando hay varios bloques.
Además, si el puerto 80 está ocupado por IIS, Skype o un servicio de Adobe, Apache ni arranca. Cambiar a Listen 8080 y <VirtualHost *:8080> soluciona el conflicto, pero entonces la URL pasa a ser tienda.local:8080. Es una limitación real que no se puede evitar sin liberar el puerto.
Cuándo esto no funciona
Configurar virtual host XAMPP no resuelve nada si trabajas con HTTPS local. Necesitas generar un certificado autofirmado y añadir SSLEngine on con <VirtualHost *:443>. Tampoco sirve si tu proyecto usa Docker o Laravel Herd, donde el flujo es distinto.
En equipos con antivirus que interceptan el tráfico HTTP (Kaspersky, ESET), Apache puede responder pero el navegador mostrará advertencias. Desactivar la inspección SSL del antivirus para *.local es la salida más limpia.
La documentación oficial de Apache sobre name-based virtual hosts y las notas de XAMPP en su carpeta readme cubren la sintaxis, aunque rara vez mencionan el orden de carga. Ese detalle se aprende mirando los logs de apache/error.log, que indican exactamente qué archivo se está parseando y dónde falla.
Después de cada cambio, reinicia Apache desde el panel de XAMPP y verifica con httpd -S en la consola. Ese comando lista todos los virtual hosts activos y muestra cuál es el default. Si tu dominio no aparece ahí, el problema no es el navegador: es que Apache nunca leyó tu bloque.
Perfiles verificables: Sitio web
Publicado el 29 de October de 2026. Última revisión: 29 de October de 2026.