La redirection HTTP permet de capturer la requête et de rediriger l’internaute à partir de règle vers une nouvelle page Web. Par exemple le changement d’adresse des pages Web après une migration ou un changement de technologie (remplacer les page.html en /page/). Utilisé à toute les sauce, la redirection est aussi détourné, sans jeu de mots, par pur organisation du trafic, par sous-domaine, pour la redirection géographique par exemple. On l’utilise notamment en combinaison avec Google Analytic. Il permet d’ailleurs de régler un problème de référencement en redirigeant les requêtes sans www vers le site avec www et vice versa de façon à optimiser le positionnement sur Google. Noter que la redirection permet de rediriger l’internaute vers d’autre domaine, ce que la réécriture ne fait pas. Le module n’est pas installé par défaut sur un serveur IIS, vous devez peut-être installer le rôle via le gestionnaire de serveur.
Le serveur reçoit la requête et retourne un nouvel entête HTTP avec son code de statut. Le navigateur doit faire une seconde requête au serveur, cette foi avec la bonne adresse. On peut d’ailleurs voir l’adresse du navigateur changer.
À ne pas confondre avec la « réécriture » largement utilisée par la communauté Apache pour « réécrire » les requêtes en adresse plus simple (lisible par l’homme) ou encore en minuscule. Moins fréquent sous IIS, déjà parce que la case n’importe pas, mais aussi parce qu’il faut installer un module externe « URL Rewrite ».
Directement sur le serveur, cette méthode permet de traiter la requête et de retourner directement la bonne page au navigateur, sans devoir faire une deuxième requête. Cette méthode permet en outre de protéger vos images d’être utilisé par d’autres sites web (le Image Hotlinking) en remplaçant l’image par une image générique. Personnellement je n’utilise pas beaucoup la « réécriture », justement parce que sous IIS ce n’était pas indispensable. D’ailleurs les Trucsweb utilise des adresses « lisibles par l’homme » sans réécrire la requêtes. La sémantique des fichiers est physiquement organisée en répertoire.
Tableau comparatif des deux méthodes
Redirection | Réécriture |
---|---|
Côté client | Côté serveur |
Change le URL dans la barre d’adresse du navigateur | Ne change pas le URL dans la barre d’adresse du navigateur |
Suporte les redirections suivantes : 301 - Permanent 302 - Trouvé 303 - Voir autre 307 - Temporaire |
Statut non applicabble |
Pratique pour mettre à jour les référencement par les moteurs de recherche. | Aussi pratique avec les moteurs de recherche en offrant des adresses amicales (friendly URL) au lieu d’adresse complexe avec chaine de requêtes. |
Example : http://serveur.com< vers http://www.serveur.com dans le navigateur. |
Example : http://trucsweb.com/Tutoriels/asp/redirection_http/ est une adresse amicale de http://trucsweb.com/tutoriels.asp?etiquette=redirection_http |
Peu rediriger vers un même domaine ou un site externe. | Réécrit vers le même domaine en utilisant un chemin relatif. (à moins d’avoir un module ARR installé sur vore serveur). |
Flux de la requête :
|
Flux de la requête :
|
Le cas Google ou la normalisation des URL
Google ou tous systèmes informatiques en fait. Les moteurs de recherche, Google Analytic, ou même vos propres scripts. Changer un seul caractère de l’adresse (URL) et vous vous retrouver avec une deuxième page, une deuxième adresse! Et donc deux sites distincts pour Google! Google permet de spécifier une préférence entre www ou sans-www. Mais si votre site permet les deux, il divisera systématiquement votre cote de popularité (le rank page) entre les deux.
L’idée est donc de normaliser l’adresse :
http://www.trucsweb.com/Tutoriels/ASP/redirection_HTTP
en
http://trucsweb.com/tutoriels/asp/redirection_http/
Nom de domaine canonique ou wwww/sans-www - Le www est en fait une convention historique sans plus. Mais c’est un sous-domaine, un simple sous-domaine bien pratique pour organiser encore une fois un trafic lourd mais aussi parce qu’il représente historiquement une page web. Deux sites impliquent aussi deux adresses de fichier témoins (cookies) qui demandent deux connexions dans le cas de session protégée par un mot de passe! Deux cas qui requiert idéalement une seule adresse, peu importe, avec ou sans www.
Avec ou sans Barre oblique à la fin - Avec ou sans, le navigateur ne fait encore une fois aucune différence. Mais pas les moteurs de recherche. En outre, si elle est omise, le navigateur doit l’ajouter alors pourquoi ne pas le faire systématiquement et régler le problème une fois pour toutes?
Majuscule/minuscule - Historiquement un problème sur un serveur Apache sensible à la case qui doit idéalement tout convertir en minuscule. Même si sous IIS ça n’a aucune importance, ça reste aussi un problème avec Google. L’idée est donc, malheureusement, de tout convertir en minuscule! Malheureusement car si la barre oblique ou le www ne change en rien la sémantique, la case nous parle! Pour mettre en évidence un répertoire par exemple...
http/https - Pas tant pour les moteurs de recherche que pour les sessions et la sécurité, la redirection est souvent utilisée pour normaliser les adresses vers un seul protocole.
IDNs - Même s’il est temps que la communauté internationale réalise que le Unicode n’est pas un caprice! Attention aux caractères accentués de plus en plus utilisés dans les URL et aux noms de domaines internationalisés (IDNs). Supporté en principe par le protocole, ça reste un simple encodage par le navigateur mais une interprétation précaire par bien des systèmes pour la plupart anglophone.
Ceci dit, c’est la croyance populaire, et typiquement wiki de tout refaire deux fois. Ça me fait penser à un baby boomer qui arrive sur le rang avec son bulldozer. Il arrache la terre, et tout ce qu’elle avait pour remodeler le sol et y creuser des étangs, replanter les arbres, fleurs et rocailles! La réalité est tout autre, voir la conclusion pour sauver du temps ...et des ressources.
Redirection HTTP côté client
La redirection HTTP est déjà possible directement en HTML avec une balise d’entête http-equiv="refresh"
. Ici après 5 secondes :
<head> <title>Redirection en htm</title> <meta http-equiv="refresh" content="5; URL=http://www.serveur.com"> </head>
On compte ici l’ouverture de deux pages, ce qui fausse le compte des visites, entre autres. D’ailleurs ce n’est pas conseillé par la W3C, notamment pour des problèmes de gestion du bouton « retour en arrière » du navigateur. Il y a aussi la redirection JavaScript qui permet la même chose :
window.location = 'http://www.serveur.com/'; // Ou mieux pour éviter deux pages dans l'historique // et éviter des problèmes avec le bouton « retour ». window.location.replace('http://www.serveur.com/');
J’utilise plutôt la redirection HTTP pour transformer les requêtes avec le protocole HTTP vers le protocole sécuritaire HTTPS dans une page de connexion. La façon la plus simple est de forcer directement la réponse dans une page ASP à l’aide de l’instruction Response
. Chaque requête faite à cette page vérifie, avec la variable serveur, que le protocole utilisé est bien HTTPS. Si ce n’est pas le cas, un code de statut 301 est retourné avec la nouvelle adresse normalisée qui contient cette fois le bon protocole :
<% If NOT Request.ServerVariables("HTTPS") = "on" or InStr(request.ServerVariables("SERVER_NAME"),"www",1) then Response.Status="301 Moved Permanently" // Noter l’ajout de la chaine de variable au bout de l’adresse Response.AddHeader "Location", "https://serveur.com/?" + Request.QueryString Response.End End if %>
Ce que j’aime avec cette façon de faire c’est qu’elle ne traite pas 100% des requêtes au serveur, souvent à l’aide d’expressions régulière dès plus gourmande, mais seulement dans ce cas spécifique, une simple page ASP. Noter que l’exemple n’affecte que la page principale, un fichier Ajax ou les images ne sont pas affectés par la redirection. Il règle en même temps le problème de « sessions multiples » en capturant du coup les www pour favoriser les sessions sans www.
httpRedirect avec fichier web.config
Le même exemple mais cette fois à l’aide d’un fichier web.config, déposé dans le même dossier que la page en question. C’est exactement le même code que génère IIS si vous utilisez son gestionnaire pour ajouter une redirection. Pour ce faire vous devez peut-être ajouter le rôle (noter la fantastique simili-traduction!) Quand c’est Google, ou PayPal qui traduit à moitié ça dénote seulement un manque d’intérêt, mais quand on paye le prix fort pour un serveur IIS, c’est pas fort! D’ailleurs en passant, c’est la première fois que j’ai un IIS en français, à éviter si vous désirer le maximum de IIS et éviter les trouble de notre caprice culturel!
// Redirection de requête HTTP en requête sécurisée HTTPS <?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <httpRedirect enabled="true" exactDestination="true" childOnly="false" destination="https://serveur.com$V$Q" /> </system.webServer> </configuration>
Propriétés de httpRedirect
enabled : Indique (true) si la redirection est active ou non.
destination : Si « enabled » est défini à « True », la propriété destination indique l’adresse (URL) de la redirection. Vous devez utiliser le chemin complet vers l’URL de destination et éviter l’utilisation de chemins relatifs. Si l’URL de destination commence avec une barre oblique, le nom d’hôte est ajouté à la requête. Si aucune destination n’est définie, les règles « wildcard » sont évaluées.
L’utilisation de variable dans la destination :
- $S
- La partie complète de l’URL qui reste après y avoir substitué l’URL de redirection, barres obliques et sous-répertoire compris.
- $V
- URL demandé sans le « servername » (le domaine) et commençant par une barre oblique. Pratique pour une redirection vers un site Web externe.
- $P
- La chaine de requête ou les variables/valeurs de la requêtes (querystring) sans le point d’interrogation (?). Utile lorsque vous devez ajouter certaines variables à la chaine ou tout simplement ajouter celles de la demande initiale.
- $Q
- La chaine de requête ou les variables/valeurs de la requêtes (querystring) cette foi avec le point d’interrogation (?). Utilisé lorsqu’il faut envoyer toutes les variables de la chaine sans en y ajouter de nouvelles. Vide s’il n’y a aucune variable, et donc sans point d’interrogation (?).
- 0-9$
- Pour spécifier un destinataire dans les règles génériques, $0 $9 peut être utilisé pour se référer aux différentes parties correspondante de l’URL d’origine.
wildcard rules collection : Si l’attribut « destination » est vide, le module de redirection lit les règles « wildcard » et compare l’url de la requête avec les règles, prend la première règle qui convient et l’utilise comme destination. Si la destination est vide et il n’y a pas de règles, la redirection ne se fait pas.
exactDestination (true/false) : Indique que la destination doit être prise comme URL exacte et qu’elle ne devrait pas y ajouter l’URL d’origine. Si la valeur est à « false », le URL d’origine sera ajouté à l’URL de destination, avec les sous répertoires. Par exemple, si la demande est envoyée à /repertoire/fichier.htm et que la destination est http://serveur/dossier, le URL de redirection sera /dossier/repertoire/fichier.htm. L’URL ajouté est relatif au chemin de fichier le plus profond où la configuration de la section de httpRedirect est réglée.
childOnly (true/false) : Mesure de protection pour empêcher la boucle sans fin (looping). Indique que la destination est un sous-répertoire du dossier et que les règles ne s’appliquent que pour ce dossier. La même chose peut-être reproduit en configurant les sous-répertoire à « enabled à false ».
httpResponseStatus : Cette propriété indique à IIS le code de statut à envoyer au navigateur. Les valeurs possibles sont :
- Permanent (301)
- Found (302) par défaut
- Temporary (307)
Exemple de redirection httpRedirect
Redirection du repertoire1 (sous-repertoires inclus) au repertoire2 :
// web.config du répertoire « repertoire1 »
<httpRedirect enabled="true" exactDestination="true" childOnly="false" destination="http://serveur.com/<chemin>/repertoire2$S" />
Redirection du repertoire1 au sous-répertoire repertoire1\sous-repertoire (même nom de fichier et variable de la chaine de requête s’il y en a) :
// web.config du répertoire « repertoire1 »
<httpRedirect enabled="true" exactDestination="true" childOnly="true" destination="http://serveur.com/<chemin>/repertoire1/sous-repertoire$S$Q" />
Redirection vers un autre serveur dans le même répertoire tout en envoyant l’URL d’origine avec les variables de la chaine de requête (querystring).
<httpRedirect enabled="true" exactDestination="true" childOnly="false" destination="http://autreserveur.com/dossier/repertoire$S?URLdorigine=$V&$P" />
Redirection vers un répertoire spécifique selon l’extension (asp et aspx).
<httpRedirect enabled="true" exactDestination="true" childOnly="true" destination=""> <clear/> <add wildcard="*.asp" destination="http://serveur.com/dossier1$0.asp" /> <add wildcard="*.aspx" destination="http://serveur.com/dossier2$0.aspx" /> </httpRedirect>
Redirection vers une page aspx pour les requêtes .htm. dans le même répertoire.
<httpRedirect enabled="true" exactDestination="true" childOnly="true" destination=""> <clear/> <add wildcard="*.htm" destination="http://serveur.com/<chemin>$0.aspx" /> </httpRedirect>
Exemple classique de fichier web.config
Un exemple de combinaison avec le fichier web.config et location
:
// Redirection directe <?xml version="1.0"?> <configuration> <location path="service.htm"> <system.webServer> <httpRedirect enabled="true" destination="http://www.serveur.com/service/" httpResponseStatus="Permanent" /> </system.webServer> </location> <location path="contact.htm"> <system.webServer> <httpRedirect enabled="true" destination="http://www.serveur.com/contact/" httpResponseStatus="Permanent" /> </system.webServer> </location> <location path="erreur.htm"> <system.webServer> <httpRedirect enabled="true" destination="http://www.serveur.com/nouvelleerreur.htm" httpResponseStatus="Permanent" /> </system.webServer> </location> </configuration>
httpRedirect avec gestionnaire IIS8
Tout peut-être fait manuellement en déposant le fichier Web.config dans les bons répertoires, un simple fichier XML que l’on peut aussi généré en programmation. On peut même avoir des fichier externe au fichier Web.config! Mais tout se fait aussi via le gestionnaire IIS.
Redirection du domaine Canonique
Il existe aussi une façon avec cette méthode pour forcer un site à ouvrir sans les www. En créant un deuxième site dans IIS. Une simple redirection du www vers le domaine canonique, ou encore l’inverse sauve dans le même chemin d’accès (path) le fichier web.config. Il faut donc deux sites Web et deux chemins d’accès physiques différents. Une fois fait il suffit de lier (liaison) le premier site vers serveur.com et le deuxième vers www.serveur.com. Ensuite on ajoute une redirection dans le deuxième site vers http://serveur.com.
Réécriture d’URL (URL Rewrite Module Version 2.0)
Plus sophistiqué, cette méthode requert l’installation du module « URL Rewrite ». Mais il permet, en plus de la redirection pure, de réécrire l’adresse pour la normaliser avec des outils et des expressions régulières des plus puissants. L’assistant permet d’automatiser la plupart des besoins mais c’est tout de même tout une technologie que je ne traiterais pas ici en détail.
Caractéristiques
- Fondé sur des règles du moteur de réécriture d’URL
- Fondé sur des règles du moteur de réécriture réponse
- Soutien aux fournisseurs de réécriture .NET personnalisé
- Motif expression régulière correspondant
- Wildcard pattern matching
- Règles de réécriture mondiaux et distribués
- Réécriture dans le contenu des balises HTML
- Les conditions préalables à des règles sortantes
- L’accès aux variables du serveur et en-têtes HTTP
- Réécriture des variables du serveur et entêtes de requête HTTP
- Réécriture des en-têtes de réponse HTTP
- La liste des variables du serveur Autoriser
- Fonction HtmlEncode
- Built-in modèles de règles
- Inverse modèle de règle proxy
- Les modèles de règles pour l’optimisation des moteurs de recherche
- Diverses actions de règle, y compris réorienter et demande abort
- Suivi des groupes de capture dans les conditions de règles
- Enregistrement des URL réécrites
- Interface utilisateur mise à jour dans le Gestionnaire IIS
- Interface utilisateur intégrée pour la gestion des règles de réécriture et de réécrire cartes
- Interface utilisateur intégrée pour l’importation de règles mod_rewrite Apache
- Interface utilisateur intégrée pour tester l’expression régulière et les modèles génériques
- Support pour IIS en mode noyau et en mode utilisateur cache de sortie
- Fonction de conversion en minuscules
- Réécrire cartes pour générer la substitution URL cours de réécriture
- Échec de la demande de soutien Tracing
Par contre la réécriture génère essentiellement des fichiers web.config dont voici en bloc plusieurs exemples :
Supprimer la dernière barre oblique
<rule name="Supprimer la dernière barre oblique" stopProcessing="true"> <match url="(.*)/$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Redirect" redirectType="Permanent" url="{R:1}" /> </rule>
Toujours ajouter la dernière barre oblique
<rule name="Ajouter la dernière barre oblique" stopProcessing="true"> <match url="(.*[^/])$" /> <conditions> <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> </conditions> <action type="Redirect" redirectType="Permanent" url="{R:1}/" /> </rule>
Domaine canonique (Sans www) et en minuscules
Sans doute le plus pratique pour ne pas dire obligatoire pour un meilleurs positionnement (SEO). Exemple des Trucsweb.com :
<rule name="Sans www et en minuscule" enabled="true"> <match url="(.*)" /> <conditions> <add input="{HTTP_HOST}" negate="true" pattern="^trucsweb\.com$" /> </conditions> <action type="Redirect" url="http://trucsweb.com/{ToLower:{R:1}}" redirectType="Permanent" /> </rule>
Redirection HTTPS
<rule name="Redirect to HTTPS" stopProcessing="true"> <match url="(.*)" /> <conditions> <add input="{HTTPS}" pattern="^OFF$" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" /> </rule>
Retourne le code de statut 503 pour une maintenance temporaire.
<rule name="503 temporaire" stopProcessing="true"> <match url="^repertoire/test/.*" /> <action type="CustomResponse" statusCode="503" subStatusCode="0" statusReason="Site est indisponible" statusDescription="Le site est en maintenance" /> </rule>
Prévenir la capture des images (Image Hotlinking)
Pratique pour protéger vos images et éviter qu’elles soient utilisées sur un autre site Web. Pas tant pour les droits d’auteur que pour l’usage abusif de la bande passante. Mais attention, vous avez des œuvres d’art, des photos d’auteur ou autres documents à préserver c’est un bon début. Ça n’empêche pas un utilisateur de sauver localement l’image. D’un autre côté, c’est plus délicat en 2015 quand on partage ses images avec Twitter (qui se contente d’user la bande passante de votre serveur) ou Facebook sans ajouter une exception. L’idéale serait de créer un dossier spécifique pour les images en haute résolution. Et ne bloquer que ces images. Voici un exemple complet dans un fichier web.config :
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="Prévenir la capture des images" enabled="true"> <match url=".*\.(gif|jpg|png)$"/> <conditions> <add input="{HTTP_REFERER}" pattern="^http://trucsweb\.com/.*$" negate="true" /> </conditions> <action type="Rewrite" url="/img/t_tut3.gif" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
Réécriture basée sur les paramètre de la chaine de requête (Query String)
<rule name="Query String Rewrite"> <match url="page\.asp$" /> <conditions> <add input="{QUERY_STRING}" pattern="p1=(\d+)" /> <add input="##{C:1}##_{QUERY_STRING}" pattern="##([^#]+)##_.*p2=(\d+)" /> </conditions> <action type="rewrite" url="page.aspx?param1={C:1}¶m2={C:2}" appendQueryString="false"/> </rule>
Conclusion
Voilà ce que l’on dit en gros à propos de la redirection, du reste ne l’oublions pas, une couche supplémentaire de traitement. Et c’est loin d’être indispensable sous IIS du moins. À moins d’une particularité d’organisation plutôt structurelle ou au niveau de la sécurité, la plupart des problèmes ont une solution plus simple. Notamment pour l’aspect SEO (Google et le référencement). En principe c’est de ASP/.NET dont il est question, et donc une manipulation côté serveur de facto. Un site bien construit permet aujourd’hui de normaliser les références, déjà avec des adresses relatives, en minuscule... D’ailleurs imaginez votre script qui ajoute automatiquement les www à toutes les adresses suivit d’une réécriture qui les enlève!
Ensuite parce qu’il y a la métadonnée canonical
qui indique l’adresse « officiel » de la page à Google au lieu du url de la requête. Google ignore du coup l’adresse hors de portée saisie par l’internaute. Et oui, après tout ce bla bla, ce petit bout de code règle tous les problèmes de référencement en proposant une adresse déjà normalisée ou « amicale ». Notez la microdonnée itemprop="url"
, toujours pour Google et pour la même raison... !
<link rel="canonical" itemprop="url" href="http://domaine-canonique.com/dossier_en_minuscules/avec_barre_oblique_a_la_fin/" />
Références
- IIS 7 URL Rewrite Module
- URL Rewrite Module : The Official Microsoft IIS Site
- Reverse Proxy with URL Rewrite v2 and Application Request Routing
- URL Rewrite Module Configuration Reference
- 10 URL Rewriting Tips and Tricks
- HTTP Redirects <httpRedirect> : The Official Microsoft IIS Site
- W3C - HTTP/1.1 Status Code Definitions
- Server Header Checker Tool
- Fiddler - The free web debugging proxy for any browser, system or platform
- Windows Sysinternals - Process Monitor v3.2 par Mark Russinovich