Redirections

(cf doc apache officielle)

mod_alias et directives alias

Les directives fournies par ce module replica Rolex submariner permettent de manipuler et de contrôler les URLs à l’arrivée des requêtes sur le serveur. Les directives Alias et ScriptAlias permettent de faire correspondre des URLs avec des chemins du système de fichiers. Ceci permet de servir des contenus qui ne sont pas situés dans l’arborescence de DocumentRoot comme s’ils y étaient réellement. La directive ScriptAlias a pour effet supplémentaire de marquer le répertoire cible comme conteneur de scripts CGI.

mod_alias est conçu pour traiter des tâches simples replica watches uk  de manipulation d’URL. Pour des tâches plus complexes comme la manipulation des chaînes d’arguments des requêtes, utilisez plutôt les outils fournis par le module mod_rewrite

Chronologie du traitement

Les alias et redirections ont la même portée que les autres regles, suivant par exemple qu’elle apparaissent dans la section principale , dans une top uk replica watches section <Directory> ou sont conditionnées par un <If*…>.
Dans une section <VirtualHost>) c’est particulier:

toutes les redirections sont traitées avant les alias, et ainsi, une requête qui correspond à une directive Redirect ou RedirectMatch ne se verra jamais appliquer d’alias. Deuxièmement, les alias et redirections sont traités selon l’ordre dans lequel ils apparaissent dans le fichier de configuration, seule la première correspondance étant prise en compte.

Ainsi, lorsqu’une ou plusieurs de ces directives s’appliquent au même sous-répertoire, vous devez classer les chemins du plus précis au moins précis afin que toutes les directives puissent éventuellement s’appliquer, comme dans l’exemple suivant :

Alias "/foo/bar" "/baz"
Alias "/foo" "/gaq"

La définition de directives Alias, ScriptAlias ou Redirect au sein de sections <Location> ou <LocationMatch> l’emporte sur d’autres définitions éventuelles de ces mêmes directives au niveau de la configuration générale du serveur.

top

Directive Alias

Description: Met en correspondance des URLs avec des chemins du système de fichiers
Syntaxe: Alias [chemin URL]
chemin fichier|chemin répertoire
Contexte: configuration globale, serveur virtuel
Statut: Base
Module: mod_alias

La directive Alias permet de stocker des documents (destinés à être servis) dans des zones du système de fichiers situées en dehors de l’arborescence du site web DocumentRoot. Les URLs dont le chemin (décodé avec caractères %) commence par chemin URL seront mises en correspondance avec des fichiers locaux dont le chemin commence par chemin répertoire. Le chemin URL est sensible à la casse, même sur les systèmes de fichiers insensibles à la casse.

Alias "/image" "/ftp/pub/image"

Une requête pour http://example.com/image/foo.gif fera renvoyer par le serveur le fichier /ftp/pub/image/foo.gif.

Notez que si vous ajoutez un slash de fin au chemin URL, vous devrez aussi ajouter un slash de fin au chemin de la requête. Autrement dit, si vous définissez

Alias "/icons/" "/usr/local/apache/icons/"

l’alias précédent ne s’appliquera pas à l’URL /icons à cause de l’absence du slash final. Ainsi, si le slash final est absent du chemin de l’URL, il doit aussi l’être du chemin du fichier.

REm: si vous créez un alias ayant pour cible un répertoire situé en dehors de l’arborescence de votre site web DocumentRoot, vous devrez probablement permettre explicitement l’accès à ce répertoire.

Alias "/image" "/ftp/pub/image"
<Directory "/ftp/pub/image">
    Require all granted
</Directory>

Le nombre de slashes dans le paramètre chemin URL doit correspondre au nombre de slashes dans le chemin URL de la requête.

redirect

mod_alias also allows you to inform clients that the requested URL is incorrect, causing the client to make another request for a different resource. This is accomplished, using the Redirect directive.

La directive  Redirect fonctionne en  gros comme la directve  Alias à la différence qu’elle n’est pas transparente. Le cleint est informé (plus ou moins explicitement) que l’URL demandé au départ est incorrect et va être redirigé.

1

Il est aussi possible de rajouter un statut, pour informer plus précisément le client :

Redirect permanent  /images http://www.another-example-site.com/images

Ici permanent indique que les images ont  définitivement été déplaccées…

Voici les 4 valeurs possibles pour le statut:

  • permanent tells the client the resource has moved permanently. This returns a 301 HTTP status code.
  • temp is the default behavior, and tells the client the resource has moved temporarily. This returns a 302 HTTP status code.
  • seeother tells the user the requested resource has been replaced by another one. This returns a 303 HTTP status code.
  • gone tells the user that the resource they are looking for has been removed permanently. When using this argument, you don’t need to specify a final URL. This returns a 410 HTTP status code.

Exemple de redirection http vers https

RediRedirect permanent / https://localhost/

ou plus générique

Redirect permanent / https://%{HTTP_HOST}%{REQUEST_URI}

mod_rewrite et directive rewrite

Le module Apache mod_rewrite est un module puissant et sophistiqué qui  permet la réécriture des URLs. Grâce à lui, vous pouvez effectuer quasiment tous les types de réécriture d’URLs dont vous avez besoin. Il est cependant assez complexe, et peut paraître intimidant au débutant. Certains ont aussi tendance à traiter les règles de réécriture comme des incantations magiques, et à les utiliser sans vraiment comprendre leur manière d’agir.

Gardez à l’esprit que de nombreuses tâches de manipulation d’URLs courantes n’ont pas besoin de la puissance et de la complexité de mod_rewrite. Pour les tâches simples, voir mod_alias

Regles d’écritures

Une règle de réécriture RewriteRule est constituée de trois arguments séparés par des espaces. Les arguments sont :

  1. Modèle: le modèle des URLs auxquelles la règle doit s’appliquer;
  2. Substitution: vers quoi la requête correspondante doit être transformée;
  3. [drapeaux]: options affectant la requête réécrite.

Le Modèle est une expression rationnelle. Au sein de la première règle de réécriture, ou jusqu’à ce qu’une substitution survienne, elle est comparée au chemin de l’URL de la requête entrante (la partie située après le nom d’hôte mais avant tout point d’interrogation qui indique le début d’une chaîne de paramètres de requête) ou, dans un contexte de répertoire, au chemin de la requête relativement au répertoire pour lequel la règle est définie. Lorsqu’une substitution a eu lieu, les règles suivantes effectuent leurs comparaisons par rapport à la valeur substituée.

exemple

rediriger /produits/vues vers une URL complete sans tenir compte de la casse:

RewriteRule "^/produits/vues$" "http://site2.example.com/voirproduits.html" [NC]

DEBUG

Configurer le niveau de journalisation de mod_rewrite à un des niveaux de trace via la directive LogLevel. Bien que ceci risque de vous submerger sous une énorme quantité d’informations, le débogage des problèmes avec la configuration de mod_rewrite est à ce prix car vous verrez alors exactement comment chaque règle est traitée.

Expressions rationnelles

mod_rewrite utilise le vocabulaire des Expressions rationnelles compatibles Perl. Voir la page de manuel des expressions rationnelles Perl, et l’ouvrage Mastering Regular Expressions, by Jeffrey Friedl.

Résumé des expression régulières

Motif Signification Exemple
. Correspond à tout caractère unique c.t correspondra à cat, cot, cut, etc.
+ Répète le caractère de correspondance précédent une ou plusieurs fois a+ correspond à a, aa, aaa, etc.
* Répète le caractère de correspondance précédent zéro ou plusieurs fois a* correspond à tout ce à quoi correspond a+, mais correspond aussi à la chaîne vide.
? Rend la correspondance optionnelle. colou?r correspondra à color et colour.
\ Echappe le caractère suivant \. correspondra à . (le point) et non à tout caractère unique comme expliqué plus haut
^ Appelé ancrage, correspond au début de la chaîne ^a correspond à une chaîne qui commence par a
$ L’autre ancrage, correspond à la fin de la chaîne. a$ correspond à une chaîne qui se termine par a.
( ) Regroupe plusieurs caractères en une seule entité, et conserve une correspondance à des fins d’utilisation dans une référence arrière. (ab)+ correspond à ababab – à savoir, le + s’applique au groupe. Pour plus de détails sur les références arrières, voir ci-dessous.
[ ] Une classe de caractères – correspond à un des caractères de la classe c[uoa]t correspond à cut, cot ou cat.
[^ ] Négation de la classe de caractères – correspond à tout caractère ne faisant pas partie de la classe c[^/]t correspond à cat ou c=t mais pas à c/t

Drapeaux de réécriture

Le comportement d’une règle RewriteRule peut être modifié par la présence d’un ou plusieurs drapeaux en fin de règle. Par exemple, les conditions de correspondance d’une règle peuvent être rendues insensibles à la casse par la présence du drapeau [NC] :

RewriteRule "^puppy.html" "petitchien.html" [NC]

Pour une liste des drapeaux disponibles, leurs significations, et des exemples, voir ci dessous:

.

Drapeaux et syntaxe Fonction
B Echappe les caractères non-alphanumériques dans les références arrières avant d’appliquer la transformation. détails …
backrefnoplus|BNP Avec ce drapeau, si les références arrières sont échappées, les espaces seront échappés en %20 au lieu de +. Ceci s’avère utile lorsqu’une référence arrière est utilisée dans la partie chemin, et non dans la chaîne de paramètres de la requête ; pour plus de détails, voir ici.
chain|C La règle est chaînée avec la règle suivante. Si la règle échoue, la ou les règles avec lesquelles elle est est chaînée seront sautées. détails …
cookie|CO=NAME:VAL Définit un cookie au niveau du navigateur client. La syntaxe complète est : CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]] details … détails …
discardpath|DPI Supprime la partie PATH_INFO de l’URI réécrit. détails …
END Stoppe le processus de réécriture immédiatement et n’applique plus aucune règle. Empêche aussi l’application ultérieure de règles de réécriture dans les contextes de répertoire et de fichier .htaccess (disponible à partir de la version 2.3.9 du serveur HTTP Apache). détails …
env|E=[!]VAR[:VAL] Définit la variable d’environnement VAR (à la valeur VAL si elle est fournie). La variante !VAR annule la définition de la variable VAR.détails …
forbidden|F Renvoie une réponse 403 FORBIDDEN au navigateur client. détails …
gone|G Renvoie un message d’erreur 410 GONE au navigateur client. détails …
Handler|H=Gestionnaire de contenu L’URI résultant est envoyé au Gestionnaire de contenu pour traitement. détails …
last|L Arrête le processus de réécriture immédiatement et n’applique plus aucune règle. Prêtez une attention particulière aux mises en garde concernant les contextes de niveau répertoire et .htaccess (voir aussi le drapeau END). détails …
next|N Réexécute le processus de réécriture à partir de la première règle, en utilisant le résultat du jeu de règles, sous réserve qu’il y ait un point de départ. détails …
nocase|NC Rend la comparaison entre modèles insensible à la casse. détails …
noescape|NE Empêche mod_rewrite d’effectuer un échappement hexadécimal des caractères spéciaux dans le résultat de la réécriture. détails …
nosubreq|NS La règle est sautée si la requête courante est une sous-requête interne. détails …
proxy|P Force l’envoi en interne de l’URL de substitution en tant que requête mandataire. détails …
passthrough|PT L’URI résultant est repassé au moteur de mise en correspondance des URLs pour y être traité par d’autres traducteurs URI-vers-nom de fichier, comme Alias ou Redirect. détails …
qsappend|QSA Ajoute toute chaîne de paramètres présente dans l’URL de la requête originale à toute chaîne de paramètres créée dans la cible de réécriture. détails …
qsdiscard|QSD Supprime toute chaîne de paramètres de l’URI entrant. détails …
qslast|QSL Interprète le dernier (le plus à droite) point d’interrogation comme le délimiteur de la chaîne de paramètres de la requête, au lieu du premier (le plus à gauche) comme c’est le cas habituellement. Disponble à partir de la version 2.4.19 du serveur HTTP Apache. détails …
redirect|R[=code] Force une redirection externe, avec un code de statut HTTP optionnel. détails …
skip|S=nombre Si la règle courante s’applique, le moteur de réécriture doit sauter les nombre règles suivantes. détails …
type|T=MIME-type Force l’attribution du Type-MIME spécifié au fichier cible. détails …

Quelques exemples

De l’ancienne à la nouvelle URL (en interne)

Supposons que nous ayons récemment renommé la page foo.html en bar.html, et voulions maintenant que l’ancienne URL soit toujours valide à des fins de compatibilité ascendante. En fait, on voudrait que le changement de nom soit transparent aux utilisateurs de l’ancienne URL.

Solution : On réécrit l’ancienne URL en interne vers la nouvelle via la règle suivante :
RewriteEngine  on
RewriteRule    "^/foo\.html$" "/bar.html" [PT]

De l’ancien au nouveau (en externe)

Supposons toujours que nous ayons récemment renommé la page foo.html en bar.html, et voulions maintenant que l’ancienne URL soit toujours valide à des fins de compatibilité ascendante. En revanche, nous voulons cette fois que la nouvelle URL soit suggérée aux utilisateurs de l’ancienne URL, c’est à dire que l’adresse vue depuis leur navigateur doit également être modifiée.

Solution :
On force une redirection HTTP vers la nouvelle URL, ce qui entraîne une modification de celle du navigateur et aussi de ce que voit l’utilisateur :

RewriteEngine  on
RewriteRule    "^foo\.html$"  "bar.html"  [R]
Rem: lors d’un rewrite le changement se passe au niveau du serveur sans que le navigateur le ‘sache’.
Si l’on fait un ‘redirect’ , le serveur renvoie le nouvel URL au navigateur qui execute une nouvelle requete et l4URL de la barre d’adresse se trouve changé.Dans l’exemple interne, on a utilisé mod_rewrite afin de dissimuler la redirection au client. Dans cet exemple, en revanche, on aurait pu se contenter d’une directive Redirect :

Redirect "/foo.html" "/bar.html"

Ressource déplacée vers un autre serveur

Si une ressource a été déplacée vers un autre serveur, vous pouvez faire en sorte que les URLs de l’ancien serveur continuent de fonctionner pendant un certain temps, afin de laisser au utilisateurs le temps de modifier leurs favoris.

Solution :
Vous pouvez utiliser mod_rewrite pour rediriger ces URLs vers le nouveau serveur, mais vous pouvez aussi utiliser les directives Redirect ou RedirectMatch.

#Avec mod_rewrite
RewriteEngine on
RewriteRule   "^/docs/(.+)"  "http://nouveau.example.com/docs/$1"  [R,L]
#Avec RedirectMatch
RedirectMatch "^/docs/(.*)" "http://nouveau.example.com/docs/$1"
#Avec Redirect
Redirect "/docs/" "http://nouveau.example.com/docs/"

Redirection http vers https

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

le ‘.’ indique un caractere quelconque et le ‘*’ n’importe quelle chaine eventuellement vide.
Donc (.*) indique que pour que la regle s’applique il faut qu’il y ait au moins un caractere , un URL vide ne declenche …rien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *