Sommaire du site
Présentation
Comment apprendre
L'équipement
La page web
Styles et CSS
HTML, structure de la page
HTML, éléments du corps
Le langage JavaScript
JavaScript, objets "core"
JavaScript, DOM, les bases
JavaScript, DOM, node
JavaScript, compléments
Le langage PHP, les bases
PHP, fonctions utiles
PHP pour le web
PHP, compléments
SQL, introduction
MySQL et PHP pour le web
MySQL, plus loin...
Applications AJAX
Annexes utiles
Fichier .htaccess
Sécurité des sites web
Conception d'un site web
Référencement,
syndication
Page mise à jour le : 12-08-2015
En 2010, plus de la moitié des serveurs du web utilisent le logiciel libre de serveur "Apache". Et plus particulièrement dans le cas des hébergements mutualisés avec l'ensemble "LAMP" (Linux, Apache, MySQL PHP).
Il en est de même pour beaucoup de systèmes serveurs individuels utilisés pour les tests de développement tels
que les 'XAMP' et 'EasyPHP'.
Il est facile de connaître le système de son serveur par la variable PHP :
$_SERVER['SERVER_SOFTWARE'].
Cette page donne quelques informations permettant de modifier le fonctionnement de son serveur HTTP "Apache". Si ce n'est pas votre logiciel serveur, elle ne vous concerne pas.
Donc, dès à présent, on considère que l'on utilise un serveur "Apache". Sur ce système, il existe plusieurs fichiers (textes) de configuration qui habituellement s'appellent :
'httpd.conf' configuration principale du serveur,
'php.ini' configuration de l'interpréteur PHP,
'my.ini' configuration de MySQL.
Ici, nous ne parlerons pas de ces fichiers. En effet, sur les hébergements mutualisés, il n'est pas possible d'y accéder. Quant à ceux qui gèrent leur propre serveur on peut considérer qu'ils savent configurer leur système.
Il reste le cas de ceux qui ont leur propre serveur local de test.
En principe, il n'est pas nécessaire de modifier ces fichiers de configurations. Mais si on souhaite le faire, ces
fichiers sont auto-documentés (en anglais) et on trouve dans la documentation du serveur les informations
nécessaire.
En cas de doute, une sauvegarde préalable de ces fichiers peut être utile.
La documentation du serveur "Apache 2.0" se trouve ici :
http://httpd.apache.org/docs/2.0/ (certaines pages sont en anglais)
Le fichier de configuration du serveur Apache contient des directives qui peuvent être supplantées par celles des fichiers ".htaccess" placés dans les répertoires du site, donc accessibles.
Il s'agit d'un fichier texte placé dans un des répertoires du site. Les informations qu'il contient affectent le fonctionnement du site web pour tous les répertoires en aval (sous-répertoires) de là où est placé ce fichier, sauf si un autre '.htaccess' contient des directives contraires.
Utilisateurs de Windows
Il n'est pas facile sous ce système de créer un fichier portant un nom débutant par un point et sans extension. Beaucoup d'éditeurs de texte évolués le peuvent. En cas de difficultés on peut toujours, depuis l'éditeur de texte enregistrer ce nom de fichier à condition de l'encadrer de guillemets.
Si vous utilisez un serveur de production en hébergement mutualisé, il est probable que toutes les directives ne seront pas acceptées sur votre hébergement. Il est aussi possible que votre hébergeur en rajoute. Consultez la documentation de votre hébergeur ou testez.
Prudence !
Certaines erreurs dans les directives de ce fichier peuvent provoquer de graves dysfonctionnements du site ou provoquent une erreur 500 (erreur interne au serveur).
De plus, ce n'est pas parce tout va bien sur le serveur local qu'il en sera de même sur celui de production.
Le mieux est de créer un sous-répertoire de test et d'y placer le fichier '.htaccess' à vérifier et de tester cela sur le serveur.
Et/ou faire les tests à une heure de faible trafic sur le site. Il est toujours possible de supprimer ce fichier si ça va mal.
Ce fichier est organisé en lignes de texte exprimant des directives.
On peut aussi y placer des commentaires : lignes débutant par le caractère '#'.
La liste des directives possibles est impressionnante, on peut la trouver sur le site de "Apache" :
http://httpd.apache.org/docs/2.0/mod/quickreference.html (page en anglais)
ou sur le site de l'EISTI, en français mais version 1.3 d'Apache
http://illiweb.com/manuel/Apache_1.3_VF/mod/directives.html
Cette page ne présente que celles qui semblent être les plus intéressantes.
Les directives concernant les restrictions d'accès et la réécriture des URL assez complexes sont décrites dans des paragraphes spécifiques plus bas dans cette page.
Voici quelques directives simples.
Par défaut, si l'utilisateur donne une adresse de répertoire, le contenu de celui-ci est listé.
Mais, habituellement la configuration du serveur fait que si un certain fichier existe dans ce répertoire (index.php, index.html, ...) celui-ci est adressé comme si l'utilisateur avait indiqué son nom dans l'URL.
On peut changer ce fichier par défaut par la directive : DirectoryIndex.
DirectoryIndex page1 page2
Si le fichier 'page1' existe il est utilisé, sinon ce sera 'page2'.
S'il n'y a pas de fichier d'index et que l'on ne veut pas l'affichage du répertoire on utilise :
Options -Indexes
Alors que
Options +Indexes
rétablit la possibilité d'affichage.
Dans le cas où l'on a autorisé l'affichage du répertoire, il est possible de le modifier avec la directive IndexOptions. Cette directive doit être suivie du mot 'FancyIndexing ' et d'une ou plusieurs options, en voici quelques unes :
On peut aussi faire afficher une description pour certains fichiers avec la directive
AddDescription "description" nom_du_fichier
Si l'utilisateur donne une URL qui conduit à une erreur, une directive intercepte l'erreur pour afficher une page du site :
ErrorDocument num_erreur /chemin_absolu_page
Si l'erreur 'num_erreur' se produit, la page '/chemin_absolu_page' est affichée. Il faut donner le chemin de la page depuis la racine du site ($_SERVER['DOCUMENT_ROOT']).
On peut aussi renvoyer vers une URL absolue :
ErrorDocument num_erreur http://adresse...
Les numéros d'erreur courants sont :
Dans le cas où des pages ont été déplacées dans le site, voire changées de site on peut placer une redirection :
RedirectPermanent ancienne_page nouvelle_url
RedirectPermanent ancien_repertoire nouvelle_url
Il s'agit de restreindre la consultation des pages d'une arborescence à certains utilisateurs ou machines.
Comme il s'agit de restrictions au niveau du serveur web (HTTP), les accès restent possibles en interne (par le serveur), notamment avec les fonctions 'include()' du PHP et par le FTP.
On utilise trois directives :
order deny,allow ou order allow,deny
Il ne faut pas d'espaces de part et d'autre de la virgule.
deny from origine ...
allow from origine ...
Pour ces deux dernières, 'origine' est une liste de noms de domaines (éventuellement partiels), d'adresses IP de machines ou du mot 'all' (tous).
La directive 'order' donne l'ordre d'évaluation :
order deny,allow évalue d'abord les interdictions 'deny from', si une correspond l'accès est interdit sauf si elle correspond aussi à une de 'allow from'. S'il n'y a pas de correspondance dans les deux directives, l'accès est autorisé.
order allow,deny évalue d'abord les autorisations 'allow from', si une correspond l'accès est autorisé sauf si elle correspond aussi à une de 'deny from'. S'il n'y a pas de correspondance dans les deux directives, l'accès est interdit.
Pour éclaircir cela, deux exemples :
order deny,allow
deny from all
allow from .fr 192.168
Interdit tous sauf ceux dont le nom de domaine (du FAI) se termine par '.fr' ou dont l'adresse IP commence par 192.168.
order allow,deny
deny from .ru tedata.net 196
allow from all
Autorise tous sauf ceux dont le nom de domaine (du FAI) se termine par '.ru', 'tedata.net' et ceux dont l'adresse IP commence par 196.
Une interdiction correspond à une erreur 403.
On peut protéger un simple fichier en encadrant ces directives :
<Files fichier_secret >
order allow,deny
deny from all
</Files>
L'accès à une arborescence peut être réservé à certains utilisateurs. En cas d'accès (premier accès uniquement), le serveur envoie un dialogue d'authentification.
Il faut commencer par créer un fichier d'utilisateurs. Il s'agit d'un fichier texte ou chaque ligne identifie un utilisateur autorisé. Elles sont de la forme :
nom_util:mot_depasse_crypte
La difficulté est de produire le mot de passe crypté car l'algorithme utilisé est interne au serveur et n'est pas nécessairement MD5 ou SHA.
Pour cela, les hébergeurs fournissent, depuis leur site, une page pour réaliser le cryptage. Sinon sur un serveur de type UNIX on peut recourir à l'utilitaire 'htpasswd'.
Une fois ce fichier créé, on place dans le '.htaccess' les lignes :
AuthType Basic AuthUserFile /chemin_absolu_du_ficher_utilisateurs AuthName "message du dialogue" require valid-user
Où les parties en italique sont à remplacer par ce qui convient.
L'utilisateur qui tente d'accéder à une partie de l'arborescence protégée obtiendra le dialogue :
Une fois ce dialogue validé, l'utilisateur pourra naviguer librement dans l'arborescence tant qu'il ne quitte pas le site.
Apache contient un dispositif ('mod_rewrite') qui modifie certaines adresses (URL) demandées par l'utilisateur. C'est assez intéressant pour donner aux utilisateurs des formes raccourcies d'adresses de pages du site.
Toutefois ce sera l'adresse véritable qui sera ensuite affichée dans la barre d'adresses du navigateur.
Comme cela n'est pas forcément activé dans la configuration de tous les serveurs il convient de faire un essai préalable dans un répertoire de test.
Pour que ce dispositif fonctionne, il faut tout d'abord placer dans le fichier '.htaccess' les deux directives suivantes :
Pour la suite, il est préférable d'avoir quelques connaissances des "expressions rationnelles" (ou "régulières").
(Re)voir sur ce site
ou http://fr.wikipedia.org/wiki/Expression_rationnelle
Syntaxe :
RewriteRule motif adresse_reelle
Où 'motif' est l'expression donnée dans la barre d'adresses
et 'adresse_reelle' est l'adresse effective de la page.
Voici un exemple :
Dans cet exemple et les suivants, on considère que le fichier '.htaccess' est à la racine web du serveur.
L'utilisateur qui donne comme adresse :
http://mon_serveur.fr/page
Obtiendra la page :
http://mon_serveur.fr/web/pages/t/une_page.php
On remarque que le motif '^page$' est encadré des caractères d'expression rationnelle marquant le début et la fin.
Compliquons un peu avec un autre exemple (désormais on n'indique que la ligne 'RewriteRule').
RewriteRule ^page([1-4])-([abc])$ http://mon_serveur.fr/web/pages/t$1/une_page.php?v=$2
On remarque que :
$1 sera remplacé par l'évaluation de la première parenthèse et $2 par celle de la seconde.
Ainsi l'adresse :
http://mon_serveur.fr/page3-b
Sera remplacée par :
http://mon_serveur.fr/web/pages/t3/une_page.php?v=b
La ligne contenant la directive 'RewriteRule' peut se terminer par une ou plusieurs options encadrées par les crochets. S'il y en a plusieurs, elles seront séparées par des virgules. En voici quelques unes.
L | (Last) Indique que, si cette règle est évaluée, on ne doit pas essayer les suivantes. |
F | (Forbidden) Page interdite, renvoie un code HTTP 403. |
G | (Gone) Page supprimée, renvoie un code HTTP 410. |
NC | (No Case) Le motif est analysé sans distinguer majuscules de minuscules. |
S=n | (Skip) Après évaluation, saute les 'n' règles suivantes. |
Dans le cas des options [F] et [G] il n'est pas nécessaire d'indiquer 'adresse_reelle'. On la remplace par le tiret '-'.
On peut faire précéder une directive 'RewriteRule' par une ou plusieurs directives de condition. Pour que 'RewriteRule' soit activée, il faut que toutes les conditions qui la précèdent soient remplies. On peut également réaliser un 'ou' en terminant la condition par [OR]
Syntaxe :
RewriteCond variable motif_condition
Le premier paramètre 'variable' est évalué puis est comparé au second 'motif_condition' qui peut être une expression rationnelle. La condition est remplie s'il y a concordance. On peut préfixer le second paramètre par le point d'exclamation, dans ce cas la condition est remplie s'il n'y a pas concordance.
La plupart du temps 'variable' est une variable du serveur. Dans ce cas on entoure son nom d'accolades et on préfixe cela par le caractère de pourcentage '%'
Exemple :
RewriteCond %{REMOTE_HOST} \.cn$ [OR]
RewriteCond %{REMOTE_ADDR} ^93\.80
RewriteRule ^.*$ - [F]
Interdit l'accès (toute l'arborescence) aux visiteurs venant d'un domaine se terminant par '.cn' ou dont l'adresse IP commence par '93.80'.
On a vu que les directives d'un fichier '.htaccess' remplaçaient celles de ces fichiers situés en amont de l'arborescence. Cela n'est pas toujours pratique pour les réécritures car, souvent, on souhaite utiliser celles des niveaux supérieurs et en rajouter.
Pour cela on utilise la ligne 'RewriteOptions inherit' telle que :
Options +FollowSymlinks
RewriteEngine on
RewriteOptions inherit
#On place dessous les nouvelles réécritures
....
Sur le site 'Apache' (en anglais)
http://httpd.apache.org/docs/2.2/en/mod/mod_rewrite.html
Sur le site de l'EISTI, en français mais version 1.3 d'Apache
http://illiweb.com/manuel/Apache_1.3_VF/mod/mod_rewrite.html