Restriction .htpasswd

Mise en place d’une authentification basique avec un fichier .htpasswd.

Créé le 2 novembre 2025

Mis à jour le 10 novembre 2025

Introduction


Il existe plusieurs façons de restreindre l’accès à un site distribué par Apache. La méthode la plus simple consiste à utiliser un fichier .htpasswd.

Une fois en place, l’accès au site nécessite la saisie d’identifiants valides. Cette solution est adaptée à une instance de préproduction ou à un site interne.

Mise en place du fichier .htpasswd


Mettre en place cette restriction consiste à stocker une combinaison identifiant + mot de passe dans un fichier .htpasswd, situé dans le dossier /etc/apache2.

Générez le fichier et un premier utilisateur avec la commande suivante :

# à compléter
sudo htpasswd -c /etc/apache2/.<nom_du_htpasswd> <mon_utilisateur>

# exemple
sudo htpasswd -c /etc/apache2/.my_project kevin

Pour ajouter un nouvel utilisateur sans recréer le fichier :

sudo htpasswd /etc/apache2/.<nom_du_htpasswd_existant> <autre_utilisateur>

Si vous préférez organiser plusieurs fichiers de mots de passe, créez un dossier et placez-y vos fichiers :

sudo mkdir -p /etc/apache2/sites-htpasswd # vous êtes libre de nommer ce dossier

# à compléter : création d'un htpasswd dans un dossier personnalisé
sudo htpasswd -c /etc/apache2/<votre_dossier>/.<nom_du_htpasswd> <mon_utilisateur>

# exemple
sudo htpasswd -c /etc/apache2/sites-htpasswd/.my_project kevin

Configuration du virtual host


Ajoutez les directives d’authentification dans le virtual host, dans un bloc <Directory> ou <Location> selon le périmètre à protéger.

N'oubliez pas de retirer Require all granted, qui entrerait en conflit avec Require valid-user.

Exemple avec site statique


<VirtualHost *:80>
    ServerName my-static-site.fr
    ServerAlias www.my-static-site.fr

    DocumentRoot /var/www/my_static_site

    <Directory /var/www/my_static_site>
        Options Indexes FollowSymLinks
        AllowOverride All

        AuthType Basic
        AuthName "Restricted access"
        AuthUserFile /etc/apache2/sites-htpasswd/.my_static_site
        Require valid-user
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/my_static_site_error.log
    CustomLog ${APACHE_LOG_DIR}/my_static_site_access.log combined
</VirtualHost>

Ce bloc protège l’ensemble du site statique. Dès que l’utilisateur tente d’y accéder, une fenêtre d’authentification s’affiche.

Exemple avec reverse proxy


<VirtualHost *:80>
    ServerName my-app-dev.fr
    ServerAlias www.my-app-dev.fr

    ProxyPreserveHost On

    <Location />
        AuthType Basic
        AuthName "Restricted access"
        AuthUserFile /etc/apache2/sites-htpasswd/.my_app
        Require valid-user
    </Location>

    ProxyPass        / http://localhost:4174/ retry=0
    ProxyPassReverse / http://localhost:4174/

    ProxyPass        /_next/webpack-hmr ws://localhost:4174/_next/webpack-hmr
    ProxyPassReverse /_next/webpack-hmr ws://localhost:4174/_next/webpack-hmr

    RequestHeader set X-Forwarded-Proto "http"
    RequestHeader set X-Forwarded-Port "80"

    ErrorLog ${APACHE_LOG_DIR}/my_app_error.log
    CustomLog ${APACHE_LOG_DIR}/my_app_access.log combined
</VirtualHost>

Ici, la restriction est appliquée au niveau du <Location />, ce qui bloque tout accès au proxy tant que l’utilisateur n’a pas fourni d’identifiants valides.

Cette configuration est idéale pour protéger une application Node.js ou autre application dynamique derrière Apache.

Exemple mixte (public et proxy protégé)


<VirtualHost *:80>
    ServerName my-project-dev.fr

    DocumentRoot /var/www/my_project

    <Directory /var/www/my_project/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <Location />
        AuthType Basic
        AuthName "Restricted area"
        AuthUserFile /etc/apache2/sites-htpasswd/.my_project
        Require valid-user
    </Location>

    ProxyPreserveHost On

    ProxyPass        /public !
    ProxyPass        / http://localhost:4174/ retry=0
    ProxyPassReverse / http://localhost:4174/

    ProxyPass        /_next/webpack-hmr ws://localhost:4174/_next/webpack-hmr
    ProxyPassReverse /_next/webpack-hmr ws://localhost:4174/_next/webpack-hmr

    ErrorLog ${APACHE_LOG_DIR}/my_project_error.log
    CustomLog ${APACHE_LOG_DIR}/my_project_access.log combined
</VirtualHost>

Dans cet exemple, seul le dossier /public reste libre d’accès. Tout le reste du site passe par le proxy et nécessite une authentification.

Vérification et redémarrage


sudo apache2ctl configtest
sudo systemctl restart apache2

Dès lors, le site ou l’application n’est plus accessible sans identifiants.

.htpasswd et protocole HTTPS


Si vous avez des configurations distinctes pour HTTP et HTTPS (un fichier de configuration écoutant sur le port 80 pour HTTP et un autre écoutant sur le port 443 pour HTTPS), assurez-vous d’implémenter la demande d’authentification uniquement dans la configuration HTTPS.

Le fichier de configuration HTTP sert uniquement à rediriger automatiquement les utilisateurs vers HTTPS. Il n’est donc pas nécessaire de le sécuriser par un mot de passe, puisqu'il n’est pas accessible directement. Vous devez restreindre l’accès seulement sur la version HTTPS.

Gestion de plusieurs .htpasswd


Le nom du fichier .htpasswd importe peu. Ce qui compte est le chemin vers ce fichier, déclaré dans AuthUserFile du virtual host.

Vous êtes libre d’organiser et de créer vos fichiers .htpasswd comme vous le souhaitez.

L’essentiel est de déclarer le chemin vers le fichier désiré dans les virtual hosts appropriés.

etc/
├─ apache2/
│  ├─ sites-available/
│  │  ├─ my_project.conf
│  │  ├─ my_other_project.conf
│  │
│  ├─ sites-enabled/
│  │
│  ├─ sites-htpasswd/
│  │  ├─ .my_project
│  │  ├─ .my_other_project