Réalisation de sites web

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

Sommaire détaillé

Mentions légales.

Chapitres de cette page
Contenu  -> 

Page mise à jour le : 12-08-2015

Haut de la page

Serveur Apache
Fichier '.htaccess'
Restrictions d'accès
Réécriture des URL

Fichier .htaccess

Serveur Apache

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. 

Fichier '.htaccess'

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.

Contenu

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.

Index de répertoire

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

Gestion des erreurs

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 :

Redirections

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

Si on veut rediriger vers un autre nom de domaine, le mieux est d'informer le DNS lié au domaine de la redirection. Cela sort du cadre de ce site. Il faut voir quelles possibilités votre prestataire (registrar) vous accorde sur la gestion des noms de domaine.

 

Restrictions d'accès

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.

  Interdictions / autorisations globales

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>

 

Accés protégé par authentification

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 :

Authentification

Une fois ce dialogue validé, l'utilisateur pourra naviguer librement dans l'arborescence tant qu'il ne quitte pas le site.

Réécriture des URL

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 :

Options +FollowSymlinks
RewriteEngine on

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

Directive 'RewriteRule'

Syntaxe :

RewriteRule motif adresse_reelle

Certains serveurs imposent que 'adresse_reelle' soit une adresse web absolue (http://...)

'motif' est l'expression donnée dans la barre d'adresses
et 'adresse_reelle' est l'adresse effective de la page.

Voici un exemple :

Options +FollowSymlinks
RewriteEngine on
RewriteRule ^page$ http://mon_serveur.fr/web/pages/t/une_page.php

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

Options de 'RewriteRule'

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

RewriteRule ^page$ - [G]

Réécriture conditionnelle

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

Héritage des règles

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

....

 

 

En savoir plus sur la réécriture des URL

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