Saltar la navegación

Espacio de publicación para los usuarios del sistema

En sistemas multiusuarios, cada usuario puede tener su propio sitio web alojado en su directorio casa usando para ello el módulo mod_userdir, que hay que activar, pues por defecto no lo está.

# a2enmod userdir 
Enabling module userdir.
To activate the new configuration, you need to run:
systemctl restart apache2
# systemctl restart apache2
# ls -l ../mods-enabled/userdir*
lrwxrwxrwx 1 root root 27 dic 20 22:18 ../mods-enabled/userdir.conf -> ../mods-available/userdir.conf
lrwxrwxrwx 1 root root 27 dic 20 22:18 ../mods-enabled/userdir.load -> ../mods-available/userdir.load

Un visitante que acceda, por ejemplo, a la URL http://www.asir.com/~fpg, accederá al sitio web del usuario "fpg" implementado, por defecto, en la carpeta public_html que se encuentra colgando del directorio casa de dicho usuario.

Es posible eliminar la virgulilla que aparece en la URL, y usar en las peticiones http://www.asir.com/fpg en su lugar. Para ello necesitamos instalar el módulo de Apache que permite la ejecución de código Perl, que se llama libapache2-mod-perl2.

apt install libapache2-mod-perl2

Tras el comando anterior, el módulo de Perl se ha instalado y también se ha activado:

# ls -l ../mods-enabled/perl*
lrwxrwxrwx 1 root root 27 dic 21 22:40 ../mods-enabled/perl.load -> ../mods-available/perl.load

Faltaría introducir en la configuración de Apache el código Perl que nos evitará escribir la virgulilla, y es el siguiente:

<perl>
    opendir H, '/home/';
    my @dir = readdir(H);
    closedir H;
    foreach my $u (@dir) {
        next if $u =~ m/^\./;
        if (-e "/home/$u/public_html")
        {
            push @Alias, ["/$u", "/home/$u/public_html/"];
        }
    }
</perl>

Este código, que está específicamente pensado para cuando se usa el directorio public_html, lo escribiremos al final del fichero de configuración del módulo, concretamente, en el fichero /etc/apache2/mods-available/userdir.conf.

Solo falta que Apache actualice los dos cambios hechos en la configuración, la activación de un nuevo módulo (mod_perl2) y el código Perl.

# systemctl restart apache2

Ya se puede usar la nueva URL sin la virgulilla.

Directiva UserDir

Sintaxis: UserDir directorio...

Contexto: server config, virtual host

Esta directiva, que permite varios usos, es donde se especifica cuál será el nombre del directorio donde los usuarios tendrán que construir su sitio web. Si consultamos el contenido inicial del fichero de configuración del módulo, vemos lo siguiente:

# cat /etc/apache2/mods-enabled/userdir.conf
UserDir public_html
UserDir disabled root

<Directory /home/*/public_html>
	AllowOverride FileInfo AuthConfig Limit Indexes
	Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
	Require method GET POST OPTIONS
</Directory>

Podemos observar que el directorio tiene que llamarse public_html, y al ser una ruta relativa, esta es con respecto al directorio casa del usuario.

En la directiva UserDir, el valor de directorio puede ser algo de los siguiente:

  • El nombre de un directorio o un patrón de directorio con el carácter * que representará al nombre del usuario que va en la URL.
  • La palabra reservada disabled. Desactivaría esta característica a todos los usuarios, menos a los que se nombren explícitamente con enabled.
  • La palabra reservada disabled seguida de una lista de usuarios separados por espacios. A estos usuarios se les deshabilitaría esta característica, incluso si aparecieran explícitamente con enabled.
  • La palabra reservada enabled seguida de una lista de usuarios separados por espacios. Estos usuarios tendrán habilitada esta característica, a menos que aparezcan con disabled.

En la configuración inicial del módulo vemos que se deshabilita, para este módulo, el usuario root, algo que es recomendable.

UserDir disabled root

Veamos algunos ejemplos de uso de la directiva UserDir, y cómo se traduce la petición http://maquina/~fpg/directorio/fichero.html.

UserDir public_html ~fpg/public_html/directorio/fichero.html
UserDir /usr/web /usr/web/fpg/directorio/fichero.html
UserDir /home/*/www
/home/fpg/www/directorio/fichero.html
UserDir http://maquina/users http://maquina/users/fpg/directorio/fichero.html
UserDir http://maquina/*/usr http://maquina/fpg/usr/directorio/fichero.html

También es posible especificar en UserDir varios directorios alternativos que se irán comprobando de izquierda a derecha hasta encontrar el primero que case.

UserDir "public_html" "/usr/web" "http://maquina2"

Para la petición anterior, se intenta encontrar en primer lugar ~fpg/public_html/directorio/fichero.html, si no existe la página, se intenta /usr/web/fpg/directorio/fichero.html y en último caso, se hace la redirección a http://maquina2/fpg/directorio/fichero.html.