Aller au contenu

Apache : sites virtuels

Un site virtuel (VirtualHost) permet d’héberger plusieurs noms de domaine sur un même serveur. Les exemples utilisent des noms génériques.

/etc/apache2/sites-available/exemple.com.conf :

<VirtualHost *:80>
ServerName exemple.com
ServerAlias www.exemple.com
DocumentRoot /var/www/exemple.com
<Directory /var/www/exemple.com>
Options -Indexes
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/exemple.com.error.log
CustomLog ${APACHE_LOG_DIR}/exemple.com.access.log combined
</VirtualHost>
Fenêtre de terminal
sudo a2ensite exemple.com
sudo apache2ctl configtest && sudo systemctl reload apache2

Un fichier par site, avec son propre ServerName :

<VirtualHost *:80>
ServerName blog.exemple.com
DocumentRoot /var/www/blog
</VirtualHost>
<VirtualHost *:80>
ServerName boutique.exemple.com
DocumentRoot /var/www/boutique
</VirtualHost>

Apache choisit le site d’après l’en-tête Host de la requête. Les DNS de chaque nom doivent pointer vers le serveur. sudo apache2ctl -S affiche les sites reconnus et leur ordre.

# www vers le domaine nu
<VirtualHost *:80>
ServerName www.exemple.com
Redirect permanent / http://exemple.com/
</VirtualHost>
# Dans le site : une ancienne page vers une nouvelle
Redirect permanent /ancienne-page /nouvelle-page
# Un dossier entier, en conservant la suite du chemin
RedirectMatch permanent "^/ancien/(.*)$" "/nouveau/$1"
Mot-clé Code
permanent 301, redirection permanente
temp (défaut) 302, redirection temporaire

La redirection de HTTP vers HTTPS est décrite dans HTTPS et certificats.

ErrorDocument 404 /404.html
ErrorDocument 500 /erreur.html
ErrorDocument 503 "Service momentanément indisponible"

Le code de réponse reste 404 : bon pour le référencement.

FallbackResource renvoie une page unique pour toute URL qui ne correspond à aucun fichier :

<Directory /var/www/application>
Require all granted
FallbackResource /index.html
</Directory>

Pour une application avec des fichiers statiques qui doivent rester des 404 :

<Directory /var/www/application>
Require all granted
FallbackResource /index.html
</Directory>
<Directory /var/www/application/assets>
FallbackResource disabled
</Directory>

Alternative avec le module rewrite (sudo a2enmod rewrite) :

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ /index.html [L]
<Directory /var/www/fichiers>
Options +Indexes
IndexOptions FancyIndexing HTMLTable NameWidth=* SuppressDescription
Require all granted
</Directory>
Alias /images /srv/images
<Directory /srv/images>
Require all granted
</Directory>

Sans le bloc <Directory>, l’accès est refusé (403) : Ubuntu refuse le système de fichiers par défaut.

Fenêtre de terminal
sudo apt install php-fpm
sudo a2enmod proxy_fcgi setenvif
ls /etc/apache2/conf-available | grep php # php8.3-fpm.conf (24.04), php8.5-fpm.conf (26.04)
sudo a2enconf php8.3-fpm # adapter à la version installée
sudo apache2ctl configtest && sudo systemctl reload apache2

Ou dans le site :

<FilesMatch "\.php$">
SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost"
</FilesMatch>

DirectoryIndex index.php index.html définit les fichiers d’index.

Apache répond aux noms inconnus avec le premier site chargé (par ordre alphabétique des fichiers : 000-default.conf). Pour ne servir aucun contenu :

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName inconnu.invalid
<Location />
Require all denied
</Location>
</VirtualHost>

Le préfixe 000- garantit que ce site est lu en premier.

Fenêtre de terminal
curl -I -H "Host: exemple.com" http://127.0.0.1/
curl --resolve exemple.com:80:127.0.0.1 http://exemple.com/
Symptôme Piste
Le mauvais site s’affiche ServerName ou ServerAlias incorrect ; sudo apache2ctl -S
403 Forbidden Require all granted manquant, droits (www-data), ou pas de fichier d’index avec -Indexes
404 sur des routes d’application monopage Ajouter FallbackResource /index.html
AH00112: Warning: DocumentRoot [...] does not exist Dossier inexistant : le créer
PHP s’affiche en texte brut proxy_fcgi ou la configuration php-fpm non activés
503 Service Unavailable avec PHP Service PHP-FPM arrêté (systemctl status php8.3-fpm) ou mauvais socket