Tabla de Contenidos
Esencias del Httpd en OpenBSD
Mientras Httpd carece de las mirriadas perillas y botones de algunos otros servidores web, su configuración es perfectamente adecuada para frustrarte. Empesaremos con una configuración básica y luego agregaremos opciones para mostrar las principales características de Httpd.
Mientras que el programa /usr/sbin/httpd es el software real, Httpd tiene un montón de archivos circundantes. Las partes críticas son la configuración, /etc/httpd.conf y el chroot /var/www/.
Separación de Privilegios
Un servidor web debe realizar ciertas tareas con privilegios de root. Sólo root puede asociar a los puertos comunes de servicios web el 80 y 443. Sólo root puede abrir ciertos archivos de logs. Sólo root puede leer ciertos archivos de llaves privadas. Desafortunadamente, los procesos que se ejecutan como root puede probocar un montón de daño en el sistema. Los intrusos que comprometen un proceso de root, obtienen acceso a nivel de root de la máquina.
OpenBSD utiliza la separación de privilegios para dividir tareas que requieren de root de aquellas que no lo necesitan. Cuando inicie Httpd, obtendrá un único proceso ejecutándose como root. Este proceso se enlaza a puertos, abre archivos de logs, lee archivos de claves privadas y maneja todas las otras tareas privilegiadas. Un segundo proceso perderá sus privilegios para todo excepto para manejar logs. También obtendrá procesos completamente separados que manejarán las solicitudes de los clientes. Un Httpd en su configuración estándar ejecutará cinco procesos.
# ps -ax | grep http 73113 ?? Isp 0:00.05 httpd: logger (httpd) 66836 ?? Isp 0:00.09 httpd: server (httpd) 21188 ?? Isp 0:00.11 httpd: server (httpd) 95130 ?? Isp 0:00.10 httpd: server (httpd) 4838 ?? Isp 0:00.09 /usr/sbin/httpd
Cuando un proceso no privilegiado necesita información privilegiada, la solicita a los procesos padres. El proceso padre privilegiado determina si el proceso hijo recibe esa información o no. No hay razón para que el logger tenga las claves privadas, por lo que nunca tendrá esa información.
httpd(8)
El software de demonio httpd, normalmente se ejecuta sin argumentos y se inicia en boot o por rcctl(8). Si embargo, es posible que deba manipularlo ocasionalmente. Vamos a cubrir algunas de estas en las seciones apropiadas, aquí tenemos un par de opciones para empezar.
No hay nada como la sensación enfermiza de reiniciar un servicio que está atendiendo solicitudes de clientes, sólo para obtener un mensaje de error como el error de sintaxis en la línea 831 y el demonio se siega completamente a ejecutarse. Valide el archivo de configuración antes de intentar reiniciar el servidor con httpd -n. Si está probando un archivo de configuración alternativo, especifique ese archivo con -f.
# httpd -nf httpd.conf-test configuration OK
Si el servidor web está haciendo cosas que no espera, puede ejecutar httpd(8) en modo de debug. Esto significa que httpd no se separará del terminal, si no que imprimirán en pantalla los detalles sobre lo que está haciendo.
# httpd -d startup
Agregue una o más -v para aumentar el nivel de detalle de los mensajes. Pulse Ctrl-C para terminar el modo de debug de httpd.
Puede administrar httpd a través del mecanismo de rcctl(8) de OpenBSD, ejecutando comandos como rcctl restart httpd y rcctl reload httpd. Un reinicio borra todo de la memoria del sistema. Recargar indica al proceso principal que envíe la configuración y las claves privadas al proceso no privilegiado. Una recarga puede ser ligeramente más rápida, pero no le permitirá cambiar la configuración como prefork y el directorio chroot.
httpd.conf
El archivo de configuración de httpd.conf se asemeja a otros demonios de OpenBSD, con una sintaxis de palabras claves y valores. Los parentesis de llaves marcan algunas subsecciones, como la sconfiguraciones para hosts virtuales individuales. OpenBSD no instala un archivo de configuración, pero puede encontrar una configuración detallada de ejemplo en /etc/examples/httpd.conf. El ejemplo no funcionará fuera de la caja, usted debe fijar variables tales como la dirección IP y el nombre del servidor.
Aquí tenemos un simple httpd.conf para el sitio web de mi cliente más grande, http://www.mallard.info.
server "www.mallard.info" { listen on 192.0.2.101 port 80 root "/mallard.info" }
Esta configuración define un nombre de servidor, asocia el demonio httpd a una dirección IP y un puerto, y señala el servidor a un directorio raíz de documento. Si su sitio contiene sólo paginas estáticas, una configuración como esta basta.
Puede utilizar un archivo de configuración distinto de /etc/httpd.conf. Dale a httpd el argumento -f y el nuevo archivo de configuración. Si está configurando un nuevo archivo de configuración en /etc/rc.conf.local, dé la ruta completa al archivo. Los próximos capítulos se verán los detalles muy profundamente.
El chroot httpd
Todos los archivos del sitio web, los socket de Unix, los nodos de dispositivos, y la opción chroot en httpd.conf para especificar un nuevo directorio base del contenido web para *httpd*. Aqui abandonamos la configuración predeterminada de OpenBSD y creamos un nuevo chroot en /www.
Ahora que ya sabes donde encontrar las partes donde se encontrará nuestro nuevo chroot, vamos a configurar algunos sitios web.
Configuración Httpd
Toda la configuración de Httpd se efectúa en /etc/httpd.conf. Puede agregar archivos adicionales, pero debe especificarlos en el archivo httpd.conf. Mientras httpd(8) tiene configuraciones predeterminadas razonables para la internet moderna, puede personalizar sitios individuales, archivos de logs y administración de servidores. Httpd no se iniciará, ni se ejecutará con una configuración no válida. Cada vez que cambie el archivo de configuración, valide la configuración como se describe en httpd(8) anteriormente en este capitulo antes de intentar reiniiar el servicio. También puede actualizar la mayoría de los ajustes de configuración con SIGHUP. Las funciones vitales incluyen la configuración por servidor, los tipos de medios, la configuración global y las macros.
Macros
Una de las maneras más fáciles de romper una configuración de servidor es actualizar de manera incompleta la información de repetición. Suponga que su servidor web tiene dos direcciones IP. Un centenar de sitios escuchan en una sóla IP, mientras otros cientos escuchan en la otra. Cada sitio tiene una entrada de configuración que especifica a qué IP se asocia. Esta configuración funciona bien, hasta que necesite cambiar una dirección IP. Olvida cambiar una línea de configuración y su sitio deja de funcionar. Sítios fallidos significan clientes infelices. Buscar y reemplazar ayuda, pero cualquiera que haya tenido que cambiar docenas o sientos de archivos de sitios webs, sabe cuan rápido el cerebro humano puede bloquearse. Multiplica este problema por todas las sentencias de configuración que se repiten y de repente tienes todo tipo de errores humanos potenciales. Evita toda esta clase de problemas con el uso de las *macros*.
Una macro es una forma de reemplazar la información repetida con una variable. Las macros deben ir en la parte superior de httpd.conf, antes de cualquier otra declaración de configuración. Si necesita referirse a una dirección IP muchas veces, reemplace esa IP con una macro:
public_ip="192.168.0.4"
Puede utilizar esa macro en una configuración. Utilice un signo de $ delante del nombre de macro para indicar que es una variable. Aquí utilizo la configuración del sitio web de la sección anterior con esa macro.
server "www.mallard.info" { listen on $public_ip port 80 root "/mallard.info" }
Con sólo un único sitio, la macro nos ahorra… nada. Sin embargo, en el momento en que agrega un segundo sitio, su configuración instantáneamente se torna más manejable. También puede poner estas macros en un archivo de include y compartir ese archivo de macros a través de varios servicios, no sólo httpd. Los nombres de macro sólo pueden contener letras, dígitos y subrayados. No puede utilizar una opción de configuración como nombre de macro. No puede utilizar macros para cualquier cosa que aparece dentro de las comillas. Utilizaremos las macros ampliamente.
Macros Imprescindibles
Es posible que desee anular una macro en la línea de comandos para realizar pruebas. Esta es una mala práctica en producción, pero es invaluable en las pruebas y la depuración. Utilice la opción -D para https(8), seguido de la nueva definición de macro. Aquí ejecuto httpd en el modo de depuración y establesco la macro public_ip a 127.0.0.1.
# httpd -dvv -D public_ip=127.0.0.1
La salida del comando, no muestra el cambio de *macro*, pero programas como *netstat(1)* muestran una diferencia.
Servidores Virtuales
httpd admite varios sitios web en una instancia httpd. Su granja web típica sirve a decenas o cientos de sitios fuera de cada instalación del sistema operativo. Cada sitio se denomina Servidor Virtual.
La palabra clave Servidor marca la configuración de un único servidor virtual en httpd.conf. Nuestro ejemplo httpd.conf muestra una única instancia de servidor virtual. Puede agregar servidores virtuales hasta que la carga de tráfico TCP sobre su servidor físico decaiga a niveles inaceptables.
Varios servidores pueden tener el mismo nombre, siempre que escuchen en diferentes puertos TCP o direcciones IP. Esto se utiliza más comúnmente para configurar el acceso no cifrado y TLSa un sitio. No puedo imaginar porqué querrías varios servidores con el mismo nombre en diferentes direciones IP eb un host, pero si alguna vez tienes ese caso de uso, httpd te apoya.
Opciones Globales versus Opciones por Servidor
De las muchas opciones de httpd(8), algunas se aplican a la ejecución de la instancia httpd como un todo. Otras se aplican sólo en un único servidor virtual. Mira de nuevo nuestro archivo de configuración completo httpd.conf, con la macro.
public_ip=192.168.0.4" server "www.mallard.info" { listen on $public_ip port 80 root "/mallard.info" }
La macro public_ip es una opción global. Una vez establecida, se puede hacer referencia desde cualquier parte del httpd.conf.
La palabra reservada “sever” indica el inicio del un servidor virtual. Las opciones dentro de las llaves se aplican sólo a ese servidor.
Este breve ejmplo demuestra la flexibilidad de httpd. La mayoría de los servidores web consideran las direcciones y puertos TCP/IP como una caracteristica global. En httpd, es una opción por servidor. Sí, hay una macro que define una dirección IP, pero en realidad no configura ninguna red, es sólo una variable conveniente. No sólo puede configurar la dirección IP y el puerto en una base por servidor, puede ajustar las características TCP en una base por servidor. Discutiremos esas opciones de TCP en el capítulo 7.
Httpd tiene opciones globales muy limitadas: macros, servidores virtuales y tipos de medios. También puede definir el directorio chroot, establecer el número de proceso *httpd* para iniciar cuando se inicia el daemon y definir el directorio de los logs. Todo lo demás es una propiedad por servidor. Incluso puede anular muchas opciones globales por base de servidor.
Archivos Include
Los archivos de configuración que incluyen más de unos pocos servidores virtuales se vuelven rápidamenre engorrosos. A menudo es conveniente dividir las configuraciones sel servidor virtual en archivos de configuración separados.
Utilice la instrucción include para extraer otros archivos en httpd.conf. No puede utilizat caracteres comodín en las sentencias include, aunque se espera que aparezca un día.
include "/etc/http-site2.conf"
Tradicionalmente, el archivo de configuración incluido, tienen el nombre del sitio que cada archivo configura. Tendrás archivos como:
"/etc/sites/mallard.info,conf" "/etc/sites/default.conf" "/etc/sites/openbsd.org.conf"
y así sucesivamente. Muchos sistemas de automatización esperan exactamente esta configuración.
Al hablar de los servidores virtuales asumiremos que cada sitio tiene su propio archivo de configuración en /etc/sites/. Los archivos include puede incluir otros archivos. Supongamos que tiene configuraciones que deben ir en cada sentencia del servidor. Las sentencias de listen o de configurar un estilo de registro de logs, son a menudo comunes entre los servidores. Estos los puede configurar en un archivo de configuración y disminuir el número de ajustes para cada servidor virtual.
server "www.mallard.info" { include "/etc/global-httpd.conf" ....
El archivo de configuración global, se vería algo así:
listen on $public_ip port 80 listen on $public_ip6 port 80 log style combined
Un archivo de configuración global es conveniente, pero ten cuidado con exagerarlos. Para tener un buen equilibrio, se puede hacer un archivo include para los sitios TLS y otro independiente para los sitios que no son TLS.
Configuración de Servidores Virtuales
La parte más interesante de la configuración de httpd ocurre en la parte del Servidor Virtual. Mientras que httpd tiene decenas de opciones para el servidor virtual, los 4 más importantes controlan el, directorio de documentos, la red, los alias de sitios y la configuración específica de la ubicación.
Document Directory
Tener un servidor en ejecución es agradable, pero tener el servidor ofreciendo sitios web es mejor. Use la opción *root* para indicar a httpd donde debe encontrar los documentos que componen el sitio. El directorio root del sitio es relativo al chroot.
server "www.mallard.info" { listen on $public_ip port www listen on $public_ip6 port 80 root "/mallard.info" }
Los documentos HTML, los scripts PHP, o cualquier otra cosa que componen el contenido del sitio deben ir en el directorio mallard.info en el directorio chroot de httpd o /var/www/mallard.info.
Cualquier servidor virtual, sin una definición de un DocumentRoot, utiliza el directorio htdocs, como se explica al final de este capítulo, en el “Servidor Predeterminado”.
Networking
Conecte cada servidor virtual a la red con ls instrucción listen. Una instrucción listen debe definir una dirección de red y un puerto TCP. Httpd admite direcciones IPv4 e IPv6, pero deben especificarse por separado.
La forma más fácil de configurar httpd es que escuche en todas las direcciones IP del host, es el puerto HTTP estandar (80). Utilice * (asterisco) para indicar todas las direcciones IPv4 y :: para todas las direcciones IPv6. La palabra reservada de *port* da el puerto TCP/IP. El puerto común TCP/IP para los sitios web sin cifrar es el 80.
server "www.mallard.info" { listen on * port 80 listen on :: port 80 root "/www1" }
Para hacer que un servidor virtual escuche sólo en un IP en particular, en lugar de todas las direcciones IP, especifique la dirección:
listen on 192.168.0.4 port 80 listen on 2001:db8::101
Httpd también puede usar nombres y grupos de interfaces. Cuando se le da un nombre de interfaz o un nombre de grupo, httpd se une a la dirección IPv4 primaria de esa interfaz.
listen on re0 port 80
Los puertos se pueden especificar como números o como nombres de /etc/services. Mezclar nombres y números de puertos aumenta las probabilidades de que tus compañeros sysadmin te persigan y te golpeen. Puede utilizar cualquiera de estos nombres en macros.
Alias
Los sitios web a menudo tienen más de un nombre. Para la mayoría de los sitios, el “www” principal es opcional. Mientras que la opción del servidor da el nombre oficial del sitio, cualquier nombre adicional se puede dar con la palabra reservada del alias. Liste cada alias en una línea única, como se muestra a continuación.
server "www.mallard.info" { alias "mallard.info" alias "ww.mallard.info" alias "wwww.mallard.info" listen on $ public_ip port www listen on $ public_ip6 port 80 root "/ www1" }
Cualquier cliente que solicite uno de los nombres de alias (mallard.info, ww.mallard.info, o wwww.mallard.info) verá el sitio web www.info.mallard.info, siempre que existan las entradas DNS necesarias.
Índices
Cuando un cliente accede a un sitio web, el servidor busca un documento de índice (index) que sirva como la primera página. El archivo de índice tradicional es index.html. Algunas personas y aplicaciones utilizan otras extensiones, algunas por razones técnicas y otras por preferencia. Use la opción directory index para indicarle al servidor el nombre del archivo de indices.
directory index index.html
Sin embargo, algunos sitios no tienen ningún archivo de indice. Quizás el administrador del sitio quiera que el servidor web genere un índice para los usuarios, o tal vez los archivos sólo deben ser accesibles a las personas que saben en donde están esos archivos. Muchos servidores web crean automáticamente índices a menos que los desactiven, pero httpd no crea índices a menos que usted los haga.
Use la función directory auto-index para habilitar la creación automática de índices.
server "site10.mallard.info" { listen on $public_ip port 80 listen on $oublic_ip6 port 80 root "/site10" directory index index.htm directory auto index }
Este sitio genera índices para el usuario y por defecto utiliza un archivo índice de index.htm.
Combinando Configuraciones
Fíjese en la configuración de la sección anterior. Utilizamos la palabra reservada directory dos veces. Esas dos entradas se pueden combinar en una sola línea, a través del uso de paréntesis de llaves.
directory { auto index, index index.htm }
¿Esto es más legible y conveniente que hacer dos entradas separadas? quizás. Sin embargo, podría ser más difícil de usar con los sistemas de gestión de configuración. Elija el estilo de configuración que mejor funciona para usted.
Muchas opciones de configuración de httpd se pueden expresar entre paréntesis de llaves. Utilizaremos ambos métodos.
Locations (ubicaciones)
Frecentemente necesitamos establecer reglas especiales para partes de un sitio web. Una sentencia de locations le permite cambiar las opciones dependiendo de la ruta requerida, se indican después del nombre del sitio. En un enlace como http://www.mallard.info/awesome.htm, la location es /awesome.htm.
Puede utilizar locations para ensamblar sitios web fuera de directorios dispares en el chroot. El estándar /var/www tiene un directorio separado para los scripts CGI, /var/www/cgi-bin, pero ese directorio no está dentro de ningún directorio de sitio web. Usted debe utilizar link simbólicos para asociar el directorio cgi-bin a un sitio web o utilizar una directiva de locations en httpd.conf para lograr lo mismo: Considere el siguiente servidor, construido enteramente de los ejemplos proporcionados por OpenBSD.
server "www.mallard.info" { listen on $public_ip port 80 root "/htdocs/bgplg" location "/cgi-bin/*" { root"/" } }
El contenido principal del sitio web se encuentra en el directorio /var/www/htdocs/bgplg. La sentencia de location define la ruta de petición /cgi-bin/, indicando que la siguiente configuración se aplica cuando alguien navega a http://www.mallard.info/cgi-bin/. Ese directorio tiene su propio directorio principal (raíz), redefiniendo el directorio raíz como “/“ o el directorio raíz del chroot de httpd. Esto asigna el directorio /var/www/cgi-bin/ al sitio web, aunque el directorio raíz del sitio web es /var/www/htdocs/bgplg.
Las ubicaciones de directorio que termian en un (/) se aplican al directorio y a todo su contenido. Si está habalndo de archivos en el directorio pero no en el propio directorio necesitará usar un nombre de archivo, un asterisco o un patrón, como se explica en el capítulo 3. Por eso la configuración de nuestro directorio *cgi-bin* especifica un asterisco.
Puede utilizar las sentencias de ubicación (location), para cambiar la forma en que su servidor se comporta con las reglas de location.
Per-location Rules
Ejecutar servidores WEB, sería mucho más simple si las personas fueran coherentes. Uno de los desarrolladores web, es conocido por decir cosas como: Quiero índices en este directorio solamente, y que se autentifiquen acá, y no en cualquier lugar..- hoy este directorio es sólo PHP, así que hay que habilitar Scripts allí, y no en cualquier otro lugar
.
Con la configuración por ubicación, puede proteger por ejemplo con contraseña un directorio en particular o desactivar el registro o logs de un determinado tipo de archivo. Aquí deshabilito la creación automática de índices en su directorio.
server "www.mallard.info { ... directory auto index location "/files/" { directory no auto index } }
La primera sentencia de instrucción directory habilita la auto generación de los índices para todo el sitio. La sentencia de location la deshabilita para cualquier solicitud que coincida con /files/. Un usuario que visita http://www.mallard.info verá un índice auto generado, si lo requiere, pero un visitante en el sitio http://www.mallard.info/files/, obtiene un de prohibición error 403 (forbidden). El servidor no tiene permiso para indexar el contenido de este directorio.
Si bien estos ejemplos utilizan directorios como ubicaciones, también puede utilizar sentancias de ubicación para identificar archivos. Veremos muchos ejemplos más adelante.
Tipo Mime
Los autores de sitios WEB pueden cargar casi cualquier tipo de archivo en un servidor web. Tanto el Servidor como el cliente necesitan saber como manejar los tipos de archivos aleatorios. El protocolo HTTP utiliza tipos MIME (Multipropose Internet Mail Extensions) para identificar tipos de archivo. El Servidor utiliza estos tipos MIME para enviar las sugerencias al cliente acerca de como procesar el archivo. Así como un navegador web sabe que un archivo HTML debe ser procesado, pero un archivo MP3 no lo debe.
Una definiciín de tipo MIME contiene dos partes: una definición de tipo y extensión de archivo.
text/html html htm shtml
Este ejemplo define el tipo de aplicación text/html. Es para el código HTML. La segunda parte enumera tres extensiones de archivo. Cuando un cliente solicita un archivo con un nombre que termina en .html, .htm o .shtml, httpd transmite el archivo con una nota que dice: Este material es de tipo MIME text/html. El navegador utiliza esa información para saber como tratar el archivo.
No todos los archivo requieren definición MIME. La mayoría de los navegadores modernos saben que los archivos que terminan en .html son páginas web. Sin embargo, no puede confiar en cualquier navegador. Tampoco se puede adivinar en forma aleatorio que archivo puede cargar un propietario de sitio web en su servidor. Es mejor definir explícitamente los tipos MIME más comunes para que su servidor puedar manejar los archivos que ha deinido su diseñador.
Httpd tiene definido los tipos MIME más esenciales incorporados en el código fuente. Si sabe que su servidor sólo ofrecerá archivos básicos como html, css, texto sin formato, imágenes y JavaScript, puede omitir la definición de tipos. Sin embargo, si su navegador va más allá de la más básico, un día verá que algo se rompe y volverá a definir tipos MIME. Ahorrese el problema e instálelos el día uno. Las definiciones en el archivo de configuración anulan los tipos incorporados.
Utilice la instrucciones de tipos para definir los tipos MIME en *httpd.conf*. Si necesita más razones para trabajar, puede definir cada tipo MIME directamente en el archivo de configuración en httpd.conf.
types { text/html html htm shtml }
OpenBSD incluye una lista de tipos MIME en /usr/share/misc/mime.types. Es mucho más fácil copiar estas definiciones en su configuración.
types { include "/usr/share/misc/mime.types" }
Puede definir tipos con un archivo de texto incluido o explícitamente dentro de httpd.conf, pero no en ambos. Recomiendo encarecidamente que utilice el archivo inluido.
Si su servidor particular necesita un tipo MIME especialmente definido, no cambie /usr/share/misc/mime.types. Las actualizaciones del sistema sobrescriben ese archivo. Copie ese archivo en otra ubicación, incluya la copia y realice los cambios ahí.
Authentication
Httpd permite la authentication a través de archivos estándar htpasswd de la industria. Dígale a httpd que requiera un archivo de contraseñas con la sentencia authenticate ya sea directamente en una descripción de servidor o en una declaración de ubicación. Debe proporcionar un archivo de contraseñas dentro del chroot.
location "/files/*" { authentication with "/htpasswords" }
Este ejemplo autentica a los usuarios contra el archivo de password /var/www/htpasswords.
Usted puede utilizar una definición de un dominio de seguridad, lo que le permite definir el texto que debe aparecer en el cuadro de contraseña del navegador. Sin embargo, no todos los navegadores mostrarán este mensaje.
location "/files/*" { authenticate "Sólo autorizados" with "/htpasswords" }
Una vez que requiere autenticación, nadie puede acceder al sitio hasta que ingrese un nombre de usuario y una contraseña correctos. Httpd incluye un programa htpasswd(1) escrito por la gente de OpenBSD. Donde Apache htpasswd(1) puede soportar varios algoritmos de cifrado diferentes. OpenBSD sólo admite bcrypt password. Si estás migrando a Httpd, investiga el formato htpasswd en tu antigua plataforma, antes de copiar los archivos de contraseña.
Si mantienes manualmente el archivo de contraseñas, ejecute htpasswd con el nombre de usuario como argumento. Introduzca la contraseña cuando se le solicite y htpasswd escuchará la entrada del archivo de contraseñas.
Aquí pongo una password para el usuario mallard, la cuenta Bill se utiliza para mantener el sitio mallard.info.
$> htpasswd mallard Password: Retry Password: mallard: $2b$08$Sq5gmhbbZ08YznR1TwEOCuwPPEcepVbymQQ3DBH4JcfEGisF4VVca
Para que httpasswd(1) añada la contraseña al archivo de contraseñas, dé a httpasswd el nombre del archivo de contraseñas y el nombre del usuario como argumentos, en ese orden.
# htpasswd /var/www/htpasswd mallard
Obtendrá la misma contraseña. Si el usuario ya existe, htpasswd cambia su contraseña. Si el usuario no existe en el archivo de contraseñas, lo hará ahora.
La eliminación de los usuarios del archivo de contraseñas debe realizarse manualmente.
Default Server & Settings
Httpd utiliza el servidor predeterminado cuando nada más se ajusta. Tal vez el cliente llegó al sitio por su dirección IP en lugar de un nombre de sitio web. Tal vez un servidor no tiene un directorio DocumentRoot establecido.
Si está ejecutando