====== Apache ======
===== Alias : Répertoire Virtuel =====
==== Description ====
Permet de créer par exemple http://www.monsite.com/doc pointant autre part que le répertoire de base du site
==== Création du répertoire ====
Dans l'exemple ci-dessous on pourra en allant sur **http://www.monsite.com/doc** voir le contenu de **/usr/share/doc**
Vérifier que le fichier de configuration apache **''/etc/httpd/conf/httpd.conf''** contienne la ligne suivante :
* **Include conf.d/*.conf**
grep Include /etc/httpd/conf/httpd.conf
Créer par exemple un fichier **''/etc/httpd/conf.d/doc.conf''** et insérer les lignes suivantes :
Alias /doc /usr/share/doc
Options Indexes FollowSymLinks MultiViews
Order allow,deny
Allow from all
AllowOverride None
Explication :
* **Indexes** : Permet de lister le contenu d'un répertoire
* **FollowSymLinks** : Permet de suivre les liens symboliques
* **Order allow,deny** : Ordre de filtrage, on autorise en priorité puis on refuse.
* **Allow from all** : On autorise tout le monde.
* **AllowOverride** : Permet de définir un type authetification, ici aucune.
Exemple pour apache sous Windows :
alias /doc "C:\documents"
Options Indexes MultiViews FollowSymLinks
AllowOverride AuthConfig
Order deny,allow
Allow from all
Deny from all
==== Filtrer l'accès au répertoire par IP ====
Dans l'exemple ci-dessous nous autorisons l'accès **http://www.monsite.com/doc** uniquement aux adresses locales (127.0.0.0) et au réseau 192.168.20.0 :
Alias /doc "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128 192.168.20
==== Filtrer l'accès au répertoire par mot de passe ====
Dans l'exemple ci-dessous l'accès à **http://www.monsite.com/doc** sera restreint par un mot de passe :
Il faut éditer la configuration ainsi :
Alias /doc "/usr/share/doc/"
Options Indexes MultiViews FollowSymLinks
AllowOverride AuthConfig
Order deny,allow
Allow from all
Deny from all
puis créer un fichier **''/usr/share/doc/.htaccess''** avec le contenu suivant :
AuthUserFile "/etc/apache2/.htpasswd"
AuthName "Acces /doc Restreint"
AuthType Basic
require valid-user
Pour terminer il faut créer le fichier mot de passe par la commande suivante :
htpasswd -c /etc/apache2/.htpasswd user
Pour ajouter un autre utilisateur :
htpasswd /etc/apache2/.htpasswd user2
Pour effacer l'utilisateur **user2**:
htpasswd -D /etc/apache2/.htpasswd user2
===== VirtualHost : Pour gérer plusieurs sites Web sur un même serveur =====
==== Description ====
Les hébergements virtuels par IP utilisent l'adresse IP de la connexion afin de déterminer quel serveur virtuel doit répondre. Par conséquent, vous devez disposer d'adresses IP différentes pour chaque nom de domaine complet (FQDN) que vous hébergez. Avec un hébergement virtuel par nom, le serveur s'appuit sur les informations transmises par le client dans les en-têtes HTTP de ses requêtes. La technique présentée ici vous permet de disposer de serveurs virtuels différents partagés sur une même adresse IP.
==== Activer VirtualHost par nom ====
Pour l'activer, nous allons indiquer que les sites virtuels vont écouter sur n'importe quelle IP sur le port 80.
Nous allons éditer le fichier **/etc/httpd/conf/httpd.conf** et décommenter ou ajouter la ligne suivante :
NameVirtualHost *:80
Nous allons aussi créer un répertoire dans lequel on déposera un fichiers de configuration par site Web. Ajouter la ligne suivante :
Include vhost/*.conf
Créer le répertoire
mkdir /etc/httpd/vhost
==== Création d'un VirtualHost par nom ====
Dans cet exemple nous allons 2 sites :
* www.siteweb1.com
* www.siteweb2.com
Nous allons créer les répertoires de nos deux sites :
mkdir /var/www/www.siteweb{1,2}.com
Créer et éditer le fichier **''/etc/httpd/vhost/www.siteweb1.com.conf''** et insérer par exemple les lignes suivantes :
ServerName www.siteweb1.com
ServerAlias www.monsite1.com *.messites1.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/www.siteweb1.com
DirectoryIndex index.html index.htm index.php
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
Explication :
* **** : la chaine ''*:80'' doit correspondre exactement à celle saisie pour la directive ''NameVirtualHost *:80''
* **ServerName** : Indique le domaine du site principal
* **ServerAlias** : Indique les autres domaines qui répondront au requête pour le site www.siteweb1.com.
* **DocumentRoot** : Indique le chemin du répertoire de base pour le site
Faire la même chose pour le second site mais remplacer **www.siteweb1.com** par **www.siteweb2.com**
Pour terminer redémarrer apache :
/etc/init.d/httpd restart
==== Tester les VirtualHosts ====
Pour tester il faut que les enregistements de **www.siteweb1.com** et **www.siteweb2.com** soient effectuer sur un serveur [[bind-9|DNS]]. Si ce n'est pas le cas, la configuration peut être testée en éditant préalablement un fichier nommé ''hosts'' sur votre poste de travail.
* Sous Windows éditer : ''C:\WINDOWS\system32\drivers\etc\hosts''
* Sous Linux/UNIX éditer : ''/etc/hosts''
Ajouter par exemple les lignes suivantes (admettons que l'ip de votre site est 192.168.20.45) :
192.168.20.45 www.siteweb1.com
192.168.20.45 www.siteweb2.com
192.168.20.45 www.montsite1.com
192.168.20.45 www.montsite2.com
Il ne reste plus qu'a créer une page ''index.html'' et tester dans votre navigateur.
===== Rewrite Rules : Règles de reécriture et redirection =====
==== Module de apache ====
Le module //mod_rewrite.so// doit être chargé au démarrage d'apache et la directive suivante doit être présente pour toute RewriteRules:
RewriteEngine On
Les règles de réécriture utilisent les [[regexp|expressions régulières]]
==== Quelques drapeaux (ou flags) utiles ====
**[L]**:
Celui-ci vous semble familier, comme nous l’avons vu dans notre précédent exemple. Il mérite toutefois une précision. Lorsque le module de réécriture est actif, les règles sont lues séquentiellement et l’URL est comparée ligne à ligne avec le premier argument de celles-ci jusqu’à la dernière.
Si une réécriture est effectuée, c’est la forme réécrite qui sera utilisée en entrée pour les règles suivantes.
Le flag [L] permet de sortir prématurément de la boucle.
Un autre exemple serait, en début d’une liste de règles :
Nous introduisons ici un nouveau concept, à savoir un second argument vide (ou presque, car il consiste en un seul caractère « - » ) . Cette règle particulière implique qu’il n’y a pas de réécriture, l’URL étant passée sans modification aucune. Elle signale au serveur Apache de passer toutes les URL d’images gif ou jpg sans réécriture, ni traitement successif.
**[R] [R=code]**:
Dans ces deux formes une redirection est effectuée.
Si l’argument code n’est pas précisé, une redirection 302 (déplacé temporairement) est effectuée. Si vous souhaitez faire savoir au navigateur/robot qu’une page a été remplacée définitivement, utiliser le code 301 comme dans :
RewriteRule ^ancien\.html$ http://domaine.tld/nouveau.html [R=301,L]
Dans ce cas précis, une réécriture "externe" s’impose (utilisation de http://...)
Vous voyez ci-dessus que nous avons combiné deux flags en les séparant par une virgule.
**[F]**:
Forbidden - interdit. Retourne un code 403, par exemple :
RewriteRule ^secret.html$ - [F]
( pas de réécriture vu le deuxième argument - )
**[NC]**:
NoCase, ou « insensible à la casse ». La règle suivante :
RewriteRule ^script\.php$ programme.php [NC,L]
S’appliquera aussi bien à script .php, SCRIPT.PHP ou ScRiPt .PhP
**[G]**:
Gone. Cette page n’existe plus et retourne une entête http 410
**[N]**:
Force l’analyse et l’exécution de toutes les règles en repartant du début de la liste. Ici encore, comme expliqué plus haut ([L]), c’est l’URL modifiée après exécution de la dernière règle qui est utilisée en entrée, et non l’URL originelle. Attention aux boucles infinies !!
**[C]**:
Chain, chaînage avec la ou les règles suivantes jusqu’à la première règle ne se terminant pas par [C]
Apache interprète ce flag comme suit : s’il y a réécriture (la règle est vérifiée), la règle suivante est exécutée avec la chaîne réécrite en entrée.
Si la règle ne se vérifie pas, toutes les règles qui suivent jusqu’à la première ne comportant pas le flag [C] ne sont pas appliquées.
**[QSA]**:
Query String Append. Rajoute le QUERY_STRING à la fin de l’expression, après la réécriture. A réserver pour la dernière règle de réécriture. Utilisée le plus souvent avec le flag [L], comme dans [QSA,L]
==== Exemples de config dans apache ====
Permet d’échapper tout caractère qui suit et lui ôter sa signification particulière, par exemple \. : **\**
Pour rediriger par exemple http://monsite.com/index.htm vers http://monsite.com/index.html (hors directive ////)
RewriteRule ^/index\.htm$ /index.html [L]
Pour réecrire par exemple http://monsite.com/test/index.htm en http://monsite.com/index.html
...
RewriteEngine On
RewriteBase /
RewriteRule ^index\.htm$ index.html [L]
Pour réecrire http://monsite.com/test/uk* et http://monsite.com/test/fr* en http://monsite.com/test/page.htm (* etant toute les pages derrières l'url)
...
RewriteEngine On
RewriteBase /
RewriteRule ^(fr)|(uk)(.*)$ /test/page.htm [L]
Pour réecrire par exemple http://nimportequelsite2006.com/ en http://nimportequelsite2007.com/
...
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(.*)2006(.*)$
RewriteRule ^(.*)$ http://%12007%2/test/page.htm [R,L]
Admettons la configuration suivante sur le site **www.zikossworld.com**, on force toutes les urls **http://www.zikossworld.com/dokuwiki** à être ré-ecrites en **https://wiki.zikossworld.com/** :
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} ^/dokuwiki(.*)
RewriteRule .* https://wiki.zikossworld.com/%{REQUEST_URI} [QSA,R=301,L]
Si on veux juste sécuriser en HTTPS la partie **/admin** de son site :
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} ^/admin(.*)
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [QSA,R=301,L]
===== Proxy =====
Nous allons configurer ici apache de façon suivante : Lorsque qu'on tape ''http://monserveur/siteport8083/'' que l'on arrive sur ''http://10.0.0.2:8083''. Ceci permet de passer par le port 80 du serveur pour atteindre un site sur le port 8083.
Les modules suivant doivent être chargés :
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
Modifier la configuration apache ainsi:
# Activer les règles de reécriture
RewriteEngine on
RewriteRule ^/siteport8083(.*) http://10.0.0.2:8083$1 [P,L]
# Alias proxy
ProxyPass /siteport8083 http://10.0.0.2:8083
ProxyPassReverse /siteport8083 http://10.0.0.2:8083
# Activer le proxy
ProxyRequests On
ProxyVia On
==== Proxy en vue d'une redirection de flux vers un ou plusieurs Tomcat ====
Pour relayer simplement la requêtes vers un tomcat en http
ProxyPass /test http://10.0.0.2:8383/test
ProxyPassReverse /test http://10.0.0.2:8383/test
# Il est parfois nécessaire d'ajouter la directive ci-dessous s'il y a une gestion de cookies sur le site.
ProxyPassReverseCookieDomain 10.0.0.2:8383 www.site.com
Pour relayer vers plusieurs Tomcat avec équilibrage de charge :
BalancerMember http://10.0.0.2:8383 retry=60
BalancerMember http://10.0.0.3:8384 retry=60
Allow From All
ProxyPass balancer://tomcatservers/test stickysession=JSESSIONID nofailover=off
===== SSL =====
==== Création du certificat SSL ====
Se positionner dans le répertoire de configuration apache :
cd /etc/httpd/conf/
Pour générer le certificat voir : [[openssl#creer_un_certificat_ssl|Créer un certificat SSL avec OpenSSL]]
==== Configuration dans apache ====
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/var/log/httpd/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex "file:/var/log/httpd/ssl_mutex"
DocumentRoot "/ap01/sigfod1/appl/httpd-2.2.6/htdocs"
ServerName www.example.com:443
ServerAdmin you@example.com
ErrorLog "/ap01/sigfod1/appl/httpd-2.2.6/logs/error_log"
TransferLog "/ap01/sigfod1/appl/httpd-2.2.6/logs/access_log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/httpd/conf/server.crt"
SSLCertificateKeyFile "/etc/httpd/conf/server.key"
CustomLog "/var/log/httpd/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
===== Charset =====
Pour afficher correctement les accents dans Apache, ajouter les lignes suivantes
Pour l'UTF-8 :
AddDefaultCharset UTF-8
IndexOptions Charset=UTF-8
Pour l'ISO-8859-1
Affichage par défaut
AddDefaultCharset ISO-8859-1
IndexOptions Charset=ISO-8859-1
Note :!: : **IndexOptions** permet d'afficher correctement les accents lorsqu'Apache liste un répertoire.