2009-06-08 15 views
0

J'ai une page ASP.NET pour gérer "404 page introuvable" il est configuré en configurant la section <customErrors> dans mon fichier web.config et en définissant la page d'erreur personnalisée pour les erreurs 404 dans le gestionnaire IIS.Comment rebasculez-vous les hyperliens et le contenu dans une page ASP.NET?

Cela fonctionne comme prévu pour les pages à la racine de mon site Web mais ne fonctionne pas dans un sous-répertoire du site - les liens hypertexte et le contenu de ma page d'erreur personnalisée n'ont pas la bonne base d'URL.

Tous les liens de ma page d'erreur sont des contrôles côté serveur (runat = "server") et leurs liens sont basés sur "~ /".

Lorsque je navigue sur le site avec http://mysite/nosuchfolder/nosuchfile la page avec des liens rend pensant qu'il est servi à partir de la racine, plutôt de nosuchfolder et comme tels tous les liens sont brisés dans le navigateur comme navigateur fonde les liens de nosuchfolder.

Existe-t-il un moyen de «dire» à la page ASP.NET de refaire les liens sur un autre dossier/nom de fichier?

Notes:

  • La majorité du modèle de page est rendue à partir d'une page maître
  • Je suis en IIS6 et ont mis en erreur personnalisée 404 à l'URL: /error404.aspx
  • Dans mon web.config fichier I ai configuré la section <customErrors> pour rediriger vers /error404.aspx
  • pour contourner ce problème, je suis en utilisant la balise HTML <base> dans la page, mais je veux éviter ce
  • Je ne veux pas avoir à changer tous mes « ~/» liens basés sur «/» ou en ligne basant pirater

Répondre

0

article de Scott Gu sur la réécriture d'URL m'a mis sur le droit chemin (pour ainsi dire!) - merci pour la pointe James.

La réponse est d'utiliser Context.RewritePath(newPath)

Voici le code que j'utilise dans ma page 404 -

protected override void Render(HtmlTextWriter writer) 
{ 
    string rebase = Server.UrlDecode(Request.ServerVariables["QUERY_STRING"]); 

    if (rebase.Length>10 && rebase.StartsWith("404;")) 
    { 
     try 
     { 
      rebase = new Uri(rebase.Substring(4)).AbsolutePath; 
     } 
     catch 
     { 
      rebase = "/"; 
     } 
     finally 
     { 
      Context.RewritePath(rebase); 
     } 
    } 

    base.Render(writer); 
    Response.StatusCode = 404; 
} 

Pour traiter pages manquantes .aspx de la même façon, il y a un paramètre dans web.config appelé redirectMode que vous définissez à ResponseRewrite

<customErrors mode="On" redirectMode="ResponseRewrite"> 
    <error statusCode="404" redirect="~/error404.aspx" /> 
</customErrors> 

Cela arrête le comportement par défaut de redirection l'utilisateur à ~/error404.aspx?aspxerrorpath=badfile

Remarque: ce paramètre est nouveau pour les derniers Service Pack ASP.NET (par ex. Cadre 3.5 SP1)

MSDN Reference for redirectMode

0

Lorsque vous définissez les pages d'erreur uo yoru custome, est à l'aide de redirection ou URL réécriture? Le problème que vous décrivez est un problème courant lors de l'implémentation de la réécriture d'URL dans ASP.NET. Essentiellement, dans la réécriture d'URL, le processeur ne sait pas quelle URL utiliser lors de l'analyse des URL. Un nombre si des articles/messages ont été écrits sur la façon de résoudre le problème.

http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx

http://searchengineland.com/url-rewriting-custom-error-pages-in-aspnet-20-12234

+0

Merci James, je ne suis pas en utilisant une réécriture d'URL - simplement redirection dans IIS et dans mon web.config. Je vais lire ces pages si – Alex