====== 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.