Avant de modifier quoi que ce soit, il faut dans un premier temps faire une sauvagarde du ou des fichier(s) puis activer la nouvelle configuration:
cd /etc/apache2/sites-available cp 000-default.conf mon_site.conf a2dissite 000-default.conf a2ensite mon_site.conf
Et n'oublions pas de vérifier que la syntaxe dans le fichier de configuration est correcte :
apache2ctl -t
<VirtualHost *:80> ServerName toto.org DocumentRoot /var/www/html/docs/ </VirtualHost> <VirtualHost *:80> ServerName titi.org DocumentRoot /var/www/html </VirtualHost>
UseCanonicalName Off VirtualDocumentRoot "/var/www/html/%0"
Ainsi http://toto.org/index.html revient à se rendre dans le dossier /var/www/html/toto.com/index.html
Au lieu que le serveur lise la page index.html lorsqu'un vsiteur lis cette url : http://mon-site-web.com/ Le serveur enverra au client la page portail.html
<VirtualHost *:80> <Directory "/var/www/html"> DirectoryIndex portail.html </Directory> </VirtualHost>
<VirtualHost *:80> <Directory "/var/www/html"> Options -Indexes # Activer le listage : # Options Indexes </Directory> </VirtualHost>
Admettons que l'utilisateur toto veut partager ces documents. Il devra dans un premier temps créer un dossier spécifique à cette accès :
mkdir /home/toto/www echo "acces web" > /home/toto/www/fichier.txt
On a besion d'activer le module mod_userdir :
# a2enmod userdir
Puis ajouter ces lignes dans un contexte :
<IfModule mod_userdir.c> <Directory /home/*/www> # Autres directives ... </Directory> </IfModule>
Ainsi, on peut télécharger son fichier depuis l'url http://mon-site-web.com/~toto/fichier.txt
<VirtualHost *:80> <FilesMatch "\.(jpg|jpeg|png|gif)$"> DocumentRoot /var/www/html/images/ # Dans un cas plus concret on pourrait utiliser un reverse proxy. </FilesMatch> </VirtualHost>
<IfModule mod_setenvif.c> SetEnvIf X-Forwarded-Proto "^https$" HTTPS </IfModule>
On veut faire une redirection de exemple.com vers www.exemple.com. Dans ce cas, il faut modifier le virtualhost concerné :
nano /etc/apache2/site-enabled/exemple.com.conf
<VirtualHost *:80> ServerName exemple.com RewriteEngine on RewriteRule ^/(.*)$ http://www.exemple.com%{REQUEST_URI} </VirtualHost> <VirtualHost *:80> ServerName www.exemple.com DocumentRoot /var/www/html/ </VirtualHost>
Puis on active le module permettant de réaliser ceci :
a2enmod rewrite
Redirect 301 / http://exemple.com
Par exemple http://mon-site.com/test/ devienne http://mon-site.com/docs/index.html :
<VirtualHost *:80> ServerName mon-site.com DocumentRoot /var/www/html/ RewriteEngine On RewriteRule /test/ /docs/index.html [R=301,L] ErrorLog ${APACHE_LOG_DIR}/toto.error.log CustomLog ${APACHE_LOG_DIR}/toto.access.log combined </VirtualHost>
Pour que ça fonctionne, il y a besoin du module suivant :
a2enmod rewrite
On veut que le visiteur 192.167.1.31 accède à une page du site différente par rapport aux autres internautes :
RewriteEngine On RewriteCond %{REMOTE_ADDR} ^192\.168\.1\.31 RewriteRule /(.*) /premium/$1 [R=301,L] RewriteRule /(.*) /publique/$1 [R=301,L]
On souhaite forcer l'utilisation du port 443 pour sécuriser les communications :
<VirtualHost *:80> ServerName exemple.com Redirect permanent / https://exemple.com </VirtualHost> <IfModule mod_ssl.c> <VirtualHost *:443> ServerName exemple.com SSLEngine on # ... d'autres directives </VirtualHost> </IfModule>
<VirtualHost *:80> # Par IP : <Directory "/accueil/strategie"> <RequireAny> Require ip 192.168.1.30 Require not 192.168.1.129 # Accès en local Require local </RequireAny> </Directory> # Par utilisateur (besoin du module userdir): <FilesMatch "\.(jpg|jpeg|png|gif)$"> UserDir disabled toto </FilesMatch> # Désactive les accès pour tout <File .htpasswd> Require all denied </File> </VirtualHost>
Pour une courte période on peut simplifier l'accès à une ressource situé sur un serveur web en raccourcissant son URL :
Alias /court /var/www/html/chemin/vers/le/chemin/long <VirtualHost> #... </VirtualHost>
La deuxième partie désigné par la directive correspond à l'url que l'on souhaite raccourcir.
Les directives ScriptAlias et ScriptAliasMatch permettent de désigner les répertoires pouvant contenir des fichiers exécutables. Ainsi le code suivant permet de récupérer la sortie standard d'un script pour l'afficher dans une page web.
<VirtualHost _default_:80> ScriptAlias /script/ /home/perso/scripts/ <Directory /var/www/html/cgi/> Options ExecCGI AddHandler cgi-script .pl .rb </Directory> </virtualhost>
Elle a l'avantage de conserver en mémoire le dernier scripts exécuté. Ceci permet de réduire le temps de réponse et pour cela il nous faut le module fcgid :
apt-get install libapache2-mod-fcgid
Avec cette exemple de configuration :
<VirtualHost _default_:80> <IfModule fcgid_module> <Directory /var/www/html/cgi/> Options ExecCGI AddHandler fcgid-script .fcgi .pl .rb </Directory> </IfModule> </VirtualHost>
On active le module :
a2enmod info
Puis on modifie notre hôte virtuel :
<VirtualHost *:80> <Location "/server-info"> SetHandler server-info </Location> </VirtualHost>
LogFormat "%P %U" custom CustomLog ${APACHE_LOG_DIR}/toto.access.log custom
Dans LogFormat ont choisi les variables que l'on souhaite utiliser. Par défaut common est la variable utilisé. Celle-ci contient le format suivant :
LogFormat "%h %l %u %t \"%r\" %>s %b" common
Imaginons que l'on souhaite journaliser les activités de 192.168.1.30:
<VirtualHost *:80> SetEnvIf Remote_Addr "192.168.1.30$" filtre CustomLog ${APACHE_LOG_DIR}/filtre.access.log custom env=filtre CustomLog ${APACHE_LOG_DIR}/access.log custom env=!filtre </VirtualHost>
<VirtualHost *:80> Header set X-Talking-To-Me "Are you talking to ?" </VirtualHost>
Voici le résultat attendu :
$ curl -I http://127.0.0.1
HTTP/1.1 200 OK Date: Thu, 12 Jan 2017 13:36:05 GMT Server: Apache/2.4.10 (Debian) Last-Modified: Wed, 11 Jan 2017 16:18:53 GMT ETag: "7-545d3f4f6b300" Accept-Ranges: bytes Content-Length: 7 X-Talking-To-Me: Are you talking to ? # Header personnalisé Content-Type: text/html
<VirtualHost *:80> <Directory "/var/www/"> AllowOverride None #... </Directory> </VirtualHost>
Admettons qu'une ressource doit être uniquement accessible en lecture et pas moyen d'envoyer une image. On insérer ces directives :
<VirtualHost *:80> <Location /secure> <LimitExcept GET HEAD> Allow from all </LimitExcept> </Location> </VirtualHost>
<VirtualHost *:80> <directory /var/www/html> AuthName "acces restreint" AuthType Basic AuthBasicProvider ldap AuthLDAPURL ldap://localhost/dc=asrall,dc=fr Require valid-user </directory> </VirtualHost>
awk '{print $2}' /var/log/apache2/access.log |sort |uniq -c |grep -P '^\s+\d\d\d\d '