Trucsweb.com

Trucsweb 1997-2017 - 20 ans de partage.

ASP

Redirection et rafraîchissement

RDFFav

Redirection HTTP

Redirection et réécriture d’Url, HTTP vers HTTPS, redirection vers le domaine canonique (sans www), changement d’adresse ou encore la protection des images.https, 301, rewrite, web.config, canonique

Redirection HTTP

IIS - Redirection HTTP 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.

IIS - URL rewriteÀ 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
RedirectionRéé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 :
  • Le navigateur demande une page
  • Le serveur répond avec un code de statut de la redirection
  • Le navigateur fait une deuxième requête pour la nouvelle page
  • Le serveur retourne la nouvelle page
Flux de la requête :
  • Le navigateur demande une page
  • URL Rewrite réécrit l’URL et fait la demande (toujours sur le serveur IIS) pour la nouvelle page
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!

IIS - Panneau Redirection HTTP

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

IIS - Panneau Redirection HTTP

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.

Assistant pour l’ajout de règle(s) de réécriture d’URL

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
, Analyste programmeurConception oznogco multimédia (http://oznogco.com), Trucsweb
Dernière mise à jour :

Commentaires

9/10 sur 1 revues.
       Visites : 9329 - Pages vues : 9581
X

Trucsweb.com Connexion

X

Trucsweb.com Mot de passe perdu

X

Trucsweb.com Conditions générales

Conditions

Responsabilité

La responsabilité des Trucsweb.com ne pourra être engagée en cas de faits indépendants de sa volonté. Les informations mises à disposition sur ce site le sont uniquement à titre purement informatif et ne sauraient constituer en aucun cas un conseil ou une recommandation de quelque nature que ce soit.

Aucun contrôle n'est exercé sur les références et ressources externes, l'utilisateur reconnaît que les Trucsweb.com n'assume aucune responsabilité relative à la mise à disposition de ces ressources, et ne peut être tenue responsable quant à leur contenu.

Droit applicable et juridiction compétente

Les règles en matière de droit, applicables aux contenus et aux transmissions de données sur et autour du site, sont déterminées par la loi canadienne. En cas de litige, n'ayant pu faire l'objet d'un accord à l'amiable, seuls les tribunaux canadien sont compétents.

X

Trucsweb.com Trucsweb

X

Trucsweb.com Glossaire

X

Trucsweb.com Trucsweb

X

Trucsweb.com Trucsweb

Conditions

Aucun message!

Merci.

X
Aucun message!
X

Trucsweb.com Créer un compte