Este documento explica cómo el servidor HTTP Apache usa la URL de una solicitud para determinar la ubicación del sistema de archivos desde la cual entregar un archivo.

Módulos y directivas relacionados

Módulos relacionados Directivas relacionadas

Raiz del documento

Al decidir qué archivo servir para una solicitud determinada, el comportamiento predeterminado de httpd es tomar la ruta URL de la solicitud (la parte de la URL que sigue al nombre de host y el puerto) y agregarla al final de la DocumentRoot especificado en sus archivos de configuración. Por lo tanto, los archivos y directorios debajo del DocumentRoot conforman el árbol de documentos básico que será visible desde la web.

Por ejemplo, si DocumentRoot estaban configurados para /var/www/html luego una solicitud de http://www.example.com/fish/guppies.html daría como resultado el archivo /var/www/html/fish/guppies.html siendo atendido al cliente solicitante.

Si se solicita un directorio (es decir, una ruta que termina con /), el archivo servido desde ese directorio está definido por el DirectoryIndex directiva. Por ejemplo, si DocumentRoot se establecieron como se indicó anteriormente, y usted debía establecer:

DirectoryIndex index.html index.php

Entonces una solicitud de http://www.example.com/fish/ hará que httpd intente servir el archivo /var/www/html/fish/index.html. En el caso de que ese archivo no exista, luego intentará servir el archivo /var/www/html/fish/index.php.

Si ninguno de estos archivos existía, el siguiente paso es intentar proporcionar un índice de directorio, si mod_autoindex está cargado y configurado para permitir eso.

httpd también es capaz de alojamiento virtual, donde el servidor recibe solicitudes para más de un host. En este caso, una diferente DocumentRoot se puede especificar para cada host virtual, o alternativamente, las directivas proporcionadas por el módulo mod_vhost_alias se puede utilizar para determinar dinámicamente el lugar apropiado desde el cual servir el contenido en función de la dirección IP o el nombre de host solicitados.

los DocumentRoot La directiva se establece en el archivo de configuración del servidor principal (httpd.conf) y, posiblemente, una vez por cada host virtual adicional que cree.

Archivos fuera de DocumentRoot

Con frecuencia, hay circunstancias en las que es necesario permitir el acceso web a partes del sistema de archivos que no se encuentran estrictamente debajo del DocumentRoot. httpd ofrece varias formas diferentes de lograr esto. En los sistemas Unix, los enlaces simbólicos pueden traer otras partes del sistema de archivos bajo el DocumentRoot. Por razones de seguridad, httpd seguirá enlaces simbólicos solo si el Options la configuración para el directorio relevante incluye FollowSymLinks o SymLinksIfOwnerMatch.

Alternativamente, el Alias La directiva mapeará cualquier parte del sistema de archivos en el espacio web. Por ejemplo, con

Alias "/docs" "/var/web"

la URL http://www.example.com/docs/dir/file.html será servido desde /var/web/dir/file.html. los ScriptAlias La directiva funciona de la misma manera, con el efecto adicional de que todo el contenido ubicado en la ruta de destino se trata como CGI guiones.

Para situaciones en las que necesita flexibilidad adicional, puede utilizar el AliasMatch y ScriptAliasMatch directivas para hacer poderosas expresión regular emparejamiento y sustitución basados. Por ejemplo,

ScriptAliasMatch "^/~([a-zA-Z0-9]+)/cgi-bin/(.+)"   "/home/$1/cgi-bin/$2"

mapeará una solicitud a http://example.com/~user/cgi-bin/script.cgi al camino /home/user/cgi-bin/script.cgi y tratará el archivo resultante como un script CGI.

Directorios de usuarios

Tradicionalmente en los sistemas Unix, el directorio de inicio de un usuario puede ser referido como ~user/. El módulo mod_userdir extiende esta idea a la web al permitir que se acceda a los archivos del directorio de inicio de cada usuario mediante URL como las siguientes.

http://www.example.com/~user/file.html

Por razones de seguridad, no es apropiado otorgar acceso directo al directorio de inicio de un usuario desde la web. por lo tanto, el UserDir La directiva especifica un directorio debajo del directorio de inicio del usuario donde se encuentran los archivos web. Usando la configuración predeterminada de Userdir public_html, la URL anterior se asigna a un archivo en un directorio como /home/user/public_html/file.html dónde /home/user/ es el directorio de inicio del usuario como se especifica en /etc/passwd.

También hay varias otras formas de Userdir directiva que puede utilizar en sistemas donde /etc/passwd no contiene la ubicación del directorio de inicio.

Algunas personas encuentran el símbolo “~” (que a menudo se codifica en la Web como %7e) para ser incómodo y preferir usar una alternativa string para representar directorios de usuarios. Esta funcionalidad no es compatible con mod_userdir. Sin embargo, si los directorios de inicio de los usuarios están estructurados de forma regular, entonces es posible utilizar el AliasMatch directiva para lograr el efecto deseado. Por ejemplo, para hacer http://www.example.com/upages/user/file.html mapa para /home/user/public_html/file.html, usa lo siguiente AliasMatch directiva:

AliasMatch "^/upages/([a-zA-Z0-9]+)(/(.*))?$"   "/home/$1/public_html/$3"

Redirección de URL

Las directivas de configuración discutidas en las secciones anteriores le dicen a httpd que obtenga contenido de un lugar específico en el sistema de archivos y lo devuelva al cliente. A veces, es deseable informar al cliente que el contenido solicitado se encuentra en una URL diferente e indicarle al cliente que realice una nueva solicitud con la nueva URL. Se llama redirección y es implementado por el Redirect directiva. Por ejemplo, si el contenido del directorio /foo/ bajo la DocumentRoot se mueven al nuevo directorio /bar/, puede indicar a los clientes que soliciten el contenido en la nueva ubicación de la siguiente manera:

Redirect permanent "/foo/"   "http://www.example.com/bar/"

Esto redirigirá cualquier ruta de URL que comience en /foo/ a la misma ruta de URL en el www.example.com servidor con /bar/ sustituido para /foo/. Puede redirigir a los clientes a cualquier servidor, no solo al servidor de origen.

httpd también proporciona un RedirectMatch directiva para problemas de reescritura más complicados. Por ejemplo, para redirigir las solicitudes de la página de inicio del sitio a un sitio diferente, pero dejar todas las demás solicitudes en paz, utilice la siguiente configuración:

RedirectMatch permanent "^/$"    "http://www.example.com/startpage.html"

Alternativamente, para redirigir temporalmente todas las páginas de un sitio a una página en particular de otro sitio, utilice lo siguiente:

RedirectMatch temp ".*"  "http://othersite.example.com/startpage.html"

Proxy inverso

httpd también le permite traer documentos remotos al espacio URL del servidor local. Esta técnica se llama proxy inverso porque el servidor web actúa como un servidor proxy al obtener los documentos de un servidor remoto y devolverlos al cliente. Es diferente del proxy normal (directo) porque, para el cliente, parece que los documentos se originan en el servidor proxy inverso.

En el siguiente ejemplo, cuando los clientes solicitan documentos bajo el /foo/ directorio, el servidor recupera esos documentos del /bar/ directorio en internal.example.com y los devuelve al cliente como si fueran del servidor local.

ProxyPass "/foo/" "http://internal.example.com/bar/"
ProxyPassReverse "/foo/" "http://internal.example.com/bar/"
ProxyPassReverseCookieDomain internal.example.com public.example.com
ProxyPassReverseCookiePath "/foo/" "/bar/"

los ProxyPass configura el servidor para obtener los documentos apropiados, mientras que el ProxyPassReverse La directiva reescribe las redirecciones que se originan en internal.example.com para que apunten al directorio apropiado en el servidor local. Del mismo modo, el ProxyPassReverseCookieDomain y ProxyPassReverseCookiePath reescribir las cookies establecidas por el servidor backend.

Sin embargo, es importante tener en cuenta que los enlaces dentro de los documentos no se volverán a escribir. Entonces, cualquier enlace absoluto en internal.example.com resultará en que el cliente salga del servidor proxy y solicite directamente desde internal.example.com. Puede modificar estos enlaces (y otro contenido) en una página a medida que se sirve al cliente mediante mod_substitute.

Substitute "s/internal.example.com/www.example.com/i"

Para una reescritura más sofisticada de enlaces en HTML y XHTML, el mod_proxy_html El módulo también está disponible. Le permite crear mapas de URL que deben reescribirse, de modo que se puedan manejar escenarios complejos de proxy.

Motor de reescritura

Cuando se requiere una sustitución aún más potente, el motor de reescritura proporcionado por mod_rewrite puede ser útil. Las directivas proporcionadas por este módulo pueden utilizar características de la solicitud, como el tipo de navegador o la dirección IP de origen, para decidir desde dónde entregar el contenido. Además, mod_rewrite puede usar archivos o programas de bases de datos externos para determinar cómo manejar una solicitud. El motor de reescritura es capaz de realizar los tres tipos de asignaciones discutidas anteriormente: redireccionamientos internos (alias), redireccionamientos externos y proxy. Muchos ejemplos prácticos que emplean mod_rewrite se analizan en la documentación detallada de mod_rewrite.

Archivo no encontrado

Inevitablemente, se solicitarán URL para las que no se puede encontrar ningún archivo coincidente en el sistema de archivos. Esto puede suceder por varias razones. En algunos casos, puede ser el resultado de mover documentos de una ubicación a otra. En este caso, es mejor utilizar la redirección de URL para informar a los clientes de la nueva ubicación del recurso. De esta manera, puede asegurarse de que los marcadores y enlaces antiguos seguirán funcionando, aunque el recurso se encuentre en una nueva ubicación.

Otra causa común de errores de “Archivo no encontrado” es el error de escritura accidental de URL, ya sea directamente en el navegador o en enlaces HTML. httpd proporciona el módulo mod_speling (sic) para ayudar con este problema. Cuando este módulo está activado, interceptará los errores de “Archivo no encontrado” y buscará un recurso con un nombre de archivo similar. Si se encuentra uno de esos archivos, mod_speling enviará una redirección HTTP al cliente informándole de la ubicación correcta. Si se encuentran varios archivos “cercanos”, se presentará al cliente una lista de alternativas disponibles.

Una característica especialmente útil de mod_speling es que comparará nombres de archivos sin respetar las mayúsculas y minúsculas. Esto puede ayudar a los sistemas donde los usuarios desconocen la naturaleza sensible a mayúsculas y minúsculas de las URL y el sistema de archivos Unix. Pero el uso de mod_speling para algo más que la corrección de URL ocasional puede generar una carga adicional en el servidor, ya que cada solicitud “incorrecta” es seguida por una redirección de URL y una nueva solicitud del cliente.

mod_dir proporciona FallbackResource, que se puede utilizar para asignar URI virtuales a un recurso real, que luego les sirve. Este es un reemplazo muy útil para mod_rewrite al implementar un ‘controlador frontal’

Si todos los intentos de localizar el contenido fallan, httpd devuelve una página de error con el código de estado HTTP 404 (archivo no encontrado). La apariencia de esta página se controla con el ErrorDocument directiva y se puede personalizar de manera flexible como se explica en el documento Respuestas de error personalizadas.

Otros módulos de mapeo de URL

Otros módulos disponibles para el mapeo de URL incluyen:

  • mod_actions – Asigna una solicitud a un script CGI según el método de solicitud o el tipo de recurso MIME.
  • mod_dir – Proporciona un mapeo básico de una barra al final en un archivo de índice como index.html.
  • mod_imagemap – Asigna una solicitud a una URL en función de dónde un usuario hace clic en una imagen incrustada en un documento HTML.
  • mod_negotiation – Selecciona un documento apropiado según las preferencias del cliente, como el idioma. o compresión de contenido.