Cómo solucionar el Error 403 Forbidden configurando servidores virtuales en Apache

En esta entrada nos enfrentamos al error 403 Forbidden, un problema muy común cuando configuramos servidores virtuales en las versiones más recientes de Apache. Puede ser muy frustrante, sobre todo cuando actualizamos el sistema y nuestras configuraciones dejan de funcionar.

Por qué se produce el error 403 Forbidden

En las versiones 2.4 de Apache las configuraciones de acceso son más restrictivas, siempre en aras de una mayor seguridad. Ciertos accesos y características vienen por defecto desactivados y somos nosotros los que debemos ir activando una a una las características que necesitamos.

como solucionar el error 403 forbidden
Por algún motivo el servidor web no ha permitido el acceso

En el caso que nos ocupa, el error 403 al intentar acceder a un servidor virtual, se produce porque por defecto se necesita autorización para acceder a cualquier parte del sistema de archivos que no esté bajo /var/www/ y /usr/share/. Como podemos ver en este extracto de /etc/apache2/apache2.conf:

...
<Directory />
	Options FollowSymLinks
	AllowOverride None
	Require all denied
</Directory>

<Directory /usr/share>
	AllowOverride None
	Require all granted
</Directory>

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride None
	Require all granted
</Directory>
...

Hay 3 directivas Directory que tienen que ver con todo esto. La primera, a través de la línea Require all denied se encarga de denegar el acceso a todo el mundo al sistema de ficheros desde la raíz (/).

Ahora que nadie puede acceder al sistema de ficheros, no hay forma de tener un directorio para un sitio web, por lo que las siguientes dos directivas Directory facilitarán un lugar donde colocar los contenidos web y dar autorización a todo el mundo para su acceso.

Como vemos, son los directorios /usr/share/ y /var/www/ (y todo lo que cuelgue de ellos) los elegidos. Fuera de ellos no hay acceso.

Cómo solucionar el error 403 Forbidden

Ahora que ya sabemos por qué pasa esto, es probable que nuestro problema sea que hemos configurado un servidor virtual con su DocumentRoot fuera de las ubicaciones permitidas.

En mi caso, yo soy fan de publicar mis páginas en el directorio personal de mi usuario de trabajo, bajo ~/public_html/, a razón de directorio por proyecto, aunque el acceso web no sea en base al usuario (que eso es objetivo de otra entrada), sino por servidores virtuales.

Como ejemplo de trabajo, teniendo un servidor Apache que responde al dominio www.dominioprincipal.com, vamos a configurar un servidor virtual accesible desde el dominio www.midominio.com, cuyo archivo de configuración será /etc/apache2/sites-available/www.midominio.com.conf y cuyo contenido situaremos en una carpeta llamada midominio/.

Vamos a estudiar las distintas soluciones.

Cómo permitir el acceso vía web a los directorios personales

Tenemos distintos tipos de soluciones, con un mayor o menor grado de configuraciones adicionales. Vamos a estudiarlas.

Primera solución: Usa los directorios permitidos

En vez de publicar los proyectos web bajo ~/public_html/, o donde quiera que lo estés haciendo, hazlo en los directorios permitidos:

Directorio /var/www/

El servidor por defecto que crea Apache bajo Debian se encuentra en /var/www/html. Aquí puedes publicar contenidos accesibles desde el dominio principal (o cualquier dominio o dirección IP apuntando al servidor y que no tenga su propio servidor virtual configurado). Por lo tanto, es posible colgar directorios para servidores virtuales también en /var/www. La única pega, si la hay, es que /var/www pertenece a root y tendremos que andar lidiando con permisos de escritura del propio Apache (en tiempo de ejecución) y nuestros mismos (en tareas de mantenimiento y desarrollo). Lo más recomendable sería crear enlaces simbólicos desde /var/www a la localización real del directorio de trabajo.

Crearíamos un directorio /var/www/midominio/ donde alojar el sitio web (o un enlace simbólico) y lo configuraríamos en /etc/apache2/sites-available/www.midominio.com.conf mediante una línea como:

...
	DocumentRoot /var/www/midominio
...
Directorio /usr/share/

Ya hemos visto dónde configura Debian el directorio de archivos del servidor por defecto de Apache. Sin embargo, otras distribuciones tienen su DocumentRoot principal en /usr/share/www/. Por lo tanto es el lugar idóneo para colgar los proyectos para servidores virtuales, creando por ejemplo /usr/share/www/ y dentro un directorio por proyecto. De nuevo, hay que tener en cuenta que /usr/share/www pertenecerá a root, por lo que todo lo comentado para /var/www es aplicable también aquí.

Ojo, si queremos enlaces simbólicos desde /usr/share/www a las localizaciones reales de los directorios web, habrá que añadir una directiva Options FollowSymLinks en apache2.conf; tal y como hemos visto anteriormente, la cláusula Directory para /usr/share/www no la trae por defecto.

Creamos el directorio /usr/share/www/midominio/ y configuramos el servidor virtual modificando en /etc/apache2/sites-available/www.midominio.com.conf la línea:

...
	DocumentRoot /usr/share/www/midominio
...

Simplemente, funciona.

Segunda solución: Configurar apache2.conf para permitir los directorios personales

Esta solución pasa por añadir una nueva directiva Directory en apache2.conf permitiendo el acceso a los directorios personales de cada usuario. Añadiríamos un bloque como este:

...
<Directory /home/*/public_html>
	Require all granted
</Directory>
...

Esta es la versión mínima de la directiva, habría que pensar si se quieren dar permisos adicionales como indexar carpetas, enlaces simbólicos, uso de archivos .htaccess, etc. Pero desde este momento la misión principal ya la cumple. Ahora ya podemos trabajar en nuestros directorios personales, como en nuestro ejemplo /home/chacho/public_html/midominio/.

Tercera solución: Configurar el servidor virtual para trabajar con el directorio personal

Si no quieres tocar el archivo de configuración principal de Apache, /etc/apache2/apache2.conf, puedes dar los permisos desde cada archivo de configuración de servidor virtual.

Editamos /etc/apache2/sites-available/www.midominio.com.conf y añadimos una directiva Directory con la cláusula Require all granted:

<VirtualHost *:80>
	ServerName www.midominio.com

	ServerAdmin webmaster@midominio.com
	DocumentRoot /home/chacho/public_html/www.midominio.com

	<Directory /home/chacho/public_html/www.midominio.com>
		Require all granted
	</Directory>

	LogLevel info

	ErrorLog ${APACHE_LOG_DIR}/www.midominio.com-error.log
	CustomLog ${APACHE_LOG_DIR}/www.midominio.com-access.log combined
</VirtualHost>

Consideraciones finales

He omitido decir que siempre que se modifican los archivos de configuración, bien el de Apache, bien los de los servidores virtuales, hay que recargar la configuración de Apache:

~$ sudo service apache2 reload

Estas son las soluciones más comunes, siempre se pueden flexibilizar y adaptar. Adiós, error 403 Forbidden.

Dime en los comentarios cómo lo has solucionado tú. Si tienes alguna duda, pregunta o sugerencia, mejora de este artículo o petición para uno nuevo, házmelo saber.

Y si este artículo ha terminado con tu dolor de cabeza y quieres agradecérnoslo, puedes hacerlo dejando 1 $ de propina desde PayPal:

5/5 - (1 voto)

7 comentarios en «Cómo solucionar el Error 403 Forbidden configurando servidores virtuales en Apache»

  1. Hola. Intenté todas las indicaciones pero me sigue dando el mismo error. Tengo Ubuntu 20.04. ¿Tienes alguna sugerencia adicional que pueda intentar? Saludos. Rodrigo.

    Responder
    • Puedes mirar en los registros de acceso y errores del servicio web por si hubiera alguna pista. No indicas el directorio físico al que quieres acceder, la URL para hacerlo, qué ajustes has realizado, etc.

      Responder
  2. ¡Genio!
    Luego de algunas horas googleando, en mi intento de migrar mi entorno de desarrollo de Windows a Linux, este debe de haber sido el duodécimo artículo que leí, y ha sido el único que cubría mi error (seguramente porque compartimos la preferencia de localizar el public_html en nuestra carpeta personal).
    De yapa ya he aprendido algo sobre los permisos de apache para el sistema de archivos.
    ¡Muchas gracias!

    Responder

Deja un comentario

Este sitio esta protegido por reCAPTCHA y laPolítica de privacidady losTérminos del servicio de Googlese aplican.

Ads Blocker Image Powered by Code Help Pro

¡Detectado un bloqueador de publicidad!

Hemos detectado que está usando extensiones para bloquear anuncios prublicitarios. Por favor, ayúdenos desactivando dicho bloqueador para este sitio web. ¡Gracias!