Nginx sirve directorios de usuarios y raíz web al mismo tiempo

0

Quiero servir directorios del directorio de inicio de cada usuario; como el example.com/~userque se servirá desde /home/user/www. Hay algunos ejemplos por ahí (como https://unix.stackexchange.com/questions/126745/set-up-nginx-to-serve-files-from-subdirectories ); lo que en parte funciona para mí

Mi problema es: si pudiera habilitar los directorios de usuarios, la raíz (examle.com/) da 404 no encontrado. Tanto el directorio raíz como los directorios de usuario no se pueden habilitar al mismo tiempo.

Probablemente estoy estropeando la configuración. Aquí esta mi /etc/nginx/sites-enabled/default. He intentado poner el bloque "dir de usuario" encima y debajo de la ubicación "raíz"; Pero el resultado es el mismo.

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #[trimmed]...

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm;

    server_name _;

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

}


server {

    # SSL configuration
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #[trimmed]...

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;
    server_name example.com; # managed by Certbot

    #root
    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }

    #user dir
    location ~ ^/(.+?)(/.*)?$ {
        alias /home/$1/www$2;
        index  index.html index.htm;
        autoindex on;
    }


    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    #[trimmed]...

}
server {
    if ($host = example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80 ;
    listen [::]:80 ;
    server_name example.com;
    return 404; # managed by Certbot
}

¿Alguien podría ayudarme a servir el directorio raíz web y los directorios de usuarios al mismo tiempo?

afedersin
fuente
Parece que te falta un ~en tu expresión regular. Prueba:location ~ ^/~([^/]+)(/.*)?$ { ... }
Richard Smith
¡Oh, funciona! ¿Pero por qué? Sin lo que falta ~, debería haber podido acceder example.com/user(no example.com/~user), ¿no? Pero no pude hacerlo.
afedersin
Sí, pero la raíz web no funcionaría.
Richard Smith
Gracias, ¿le gustaría publicar su comentario como respuesta para que pueda aceptarlo como la solución?
afedersin