Question

J'ai récemment migré un site Web vers un nouveau CMS (Umbraco). Beaucoup de liens ont changé, mais ils peuvent être facilement corrigés en recherchant des modèles dans l'URL. Je voudrais donc écrire quelque chose qui redirigera vers la bonne page si l'ancien n'est pas trouvé. Cette partie n'est pas un problème.

Comment puis-je obtenir l'URL demandée une fois le navigateur redirigé vers ma page 404 personnalisée? J'ai essayé d'utiliser:

request.ServerVariables("HTTP_REFERER") 'sorry i corrected the typo from system to server.

Mais cela n'a pas fonctionné.

Des idées?

Le site est sur IIS 6.0. Nous avons envisagé d’utiliser des redirections 301, mais nous n’avons aucun moyen de savoir quelles pages les personnes ont ajoutées aux favoris et il y a quelques centaines de pages. Personne ne tient donc à consacrer du temps à la création des 301.

Était-ce utile?

La solution

Je fais essentiellement la même chose que vous demandez dans une page de traitement d'erreur 404 personnalisée. Sur IIS 6, l'URL d'origine est dans la chaîne de requête. Le code ci-dessous montre comment récupérer l'URL d'origine, puis transférer l'utilisateur. Dans mon cas, je suis passé d'un ancien ASP à un nouveau ASP.NET. Toutes les pages .asp ont donc dû être transférées vers des pages .aspx. De plus, certaines adresses URL ont été modifiées. Je recherche donc les mots clés dans l'ancienne adresse URL et les transmet.

//did the error go to a .ASP page?  If so, append x (for .aspx) and 
//issue a 301 permanently moved
//when we get an error, the querystring will be "404;<complete original URL>"
string targetPage = Request.RawUrl.Substring(Request.FilePath.Length);

if((null == targetPage) || (targetPage.Length == 0))
    targetPage = "[home page]";
else
{
     //find the original URL
    if(targetPage[0] == '?')
    {
        if(-1 != targetPage.IndexOf("?aspxerrorpath="))
             targetPage = targetPage.Substring(15); // ?aspxerrorpath=
        else
             targetPage = targetPage.Substring(5); // ?404;
        }
        else
        {
             if(-1 != targetPage.IndexOf("errorpath="))
             targetPage = targetPage.Substring(14); // aspxerrorpath=
             else
            targetPage = targetPage.Substring(4); // 404;
        }
    }               

    string upperTarget = targetPage.ToUpper();
    if((-1 == upperTarget.IndexOf(".ASPX")) && (-1 != upperTarget.IndexOf(".ASP")))
    {
        //this is a request for an .ASP page - permanently redirect to .aspx
        targetPage = upperTarget.Replace(".ASP", ".ASPX");
        //issue 301 redirect
        Response.Status = "301 Moved Permanently"; 
        Response.AddHeader("Location",targetPage);
        Response.End();
    }

    if(-1 != upperTarget.IndexOf("ORDER"))
    {
                //going to old order page -- forward to new page
               Response.Redirect(WebRoot + "/order.aspx");
           Response.End();
    }

Autres conseils

Que diriez-vous de:

Request.ServerVariables("HTTP_REFERER");
  

Beaucoup de liens ont changé, mais ils peuvent être facilement corrigés en recherchant des modèles dans l'URL

Plutôt que d’envoyer vos utilisateurs à un 404, avez-vous envisagé d’utiliser la ré-écriture d’URL? De cette manière, vos utilisateurs (et les moteurs de recherche, si cela est important pour vous dans ce cas) obtiendront un 301 ou 302 plutôt que de devoir passer par votre gestionnaire 404. Il est généralement plus rapide et moins stressant pour vos serveurs de gérer la réécriture au niveau de l'URL que de lancer votre code et de le traiter à cet endroit.

Microsoft a publié un module de réécriture d'URL pour IIS 7 , et sa bonne introduction est ici et ici .

Pour IIS 6, il existe un bonne introduction pour que la réécriture d'URL fonctionne, légèrement différente de celle d'IIS7.

Un exemple de règle de réécriture serait

# $1 will contain the contents of (.*) - everything after new-dir/
RewriteRule /new-dir/(.*) /find_old_page.asp?code=$1 
  

il y a quelques centaines de pages, personne ne souhaite prendre le temps de créer les 301

La beauté des règles de réécriture réside dans le fait que vous n'avez pas besoin de lister explicitement toutes vos pages, mais que vous pouvez écrire des règles qui suivent le même modèle. Nous avons dû faire quelque chose de similaire à cela récemment, et il est surprenant de constater que plusieurs des URL déplacées pourraient être gérées par quelques règles simples.

Au lieu d'utiliser une page 404, je pense que la bonne chose à faire serait de rediriger avec un 301 - Déplacement permanent du code.

Voici ce que nous faisons sur init sur nos 404 pages:

Dim AttemptedUrl As String = Request.QueryString("aspxerrorpath")
If Len(AttemptedUrl) = 0 Then AttemptedUrl = Request.Url.Query
AttemptedUrl = LCase(AttemptedUrl)
CheckForRedirects(AttemptedUrl)

CheckforRedirects a ensuite une logique personnalisée pour faire correspondre les anciennes URL avec les nouvelles.

Je dirais que c'est l'approche privilégiée (par opposition à la réécriture 301 ou aux URL) si vous avez suffisamment d'informations en interne pour faire correspondre un grand nombre d'URL de l'ancien système au nouveau système - par exemple. si vous avez une table qui fait correspondre d'anciens identifiants avec de nouveaux identifiants ou quelque chose de similaire.

S'il existe un modèle cohérent que vous pouvez utiliser pour mapper d'anciennes URL avec de nouvelles URL avec une expression régulière, la réécriture d'URL serait alors la solution.

Pour renforcer la suggestion de réécriture, Umbraco utilise déjà UrlRewriting.NET et de nouvelles réécritures peuvent être ajoutées à

.
\config\UrlRewriting.config

J'espère que cela vous aidera

Mise à jour, vous souhaitez réellement récupérer:

VB.NET:

Request.QueryString("aspxerrorpath")

C #:

Request.QueryString["aspxerrorpath"];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top