Lors de la gestion des erreurs 404 en ASP.NET, est-il possible de rediriger les erreurs 404 vers une page qui envoie le code de réponse 404 au navigateur ou faut-il utiliser server.transfer pour que l'en-tête 404 soit envoyé au navigateur tout en conservant l'adresse URL ?
Réponses
Trop de publicités?CustomErrors statusCode="404" donne lieu à une redirection temporaire 302 puis à une redirection 404 (si vous avez défini cette option dans le code de votre page 404).
Par conséquent, ce qui suit devrait le faire pour vous dans votre global.asax ou votre error HttpModule :
protected void Application_Error(Object sender, EventArgs e)
{
Exception exception = Server.GetLastError();
if (exception is HttpUnhandledException)
{
if (exception.InnerException == null)
{
Server.Transfer(ERROR_PAGE_LOCATION, false);
return;
}
exception = exception.InnerException;
}
if (exception is HttpException)
{
if (((HttpException)exception).GetHttpCode() == 404)
{
Server.ClearError();
Server.Transfer(NOT_FOUND_PAGE_LOCATION);
return;
}
}
if (Context != null && Context.IsCustomErrorEnabled)
Server.Transfer(ERROR_PAGE_LOCATION, false);
else
Log.Error("Unhandled exception trapped in Global.asax", exception);
}
Edit : Oh, et Meilleure façon d'implémenter un 404 en ASP.NET m'a mis sur la route de l'impératif Server.ClearError() ;
Ver http://www.andornot.com/blog/post/Handling-404-errors-with-ASPNET.aspx pour un post que j'ai fait qui couvre tout ça.
J'utiliserais la section customerrors du web.config, où vous pouvez spécifier la page vers laquelle vous voulez que le message 404 soit dirigé.
<configuration>
<system.web>
<customErrors mode="On" defaultRedirect="Error.aspx">
<error statusCode="404" redirect="404Error.aspx" />
</customErrors>
</system.web>
</configuration>
Sur la page de réception, si vous voulez continuer à envoyer le message 404, vous pouvez le placer dans l'événement page_load :
Response.Status = "404 Not Found";
Response.Redirect fera d'abord 302 puis 404 sur la page redirigée. Server.Transfer gardera l'URL, donc c'est 404 sur la page demandée.
Je pense que tout se résume au référencement. Je suggère d'utiliser Server.Transfer car il est plus clair pour le navigateur/moteur de recherche que l'URL demandée n'est pas trouvée. Si vous utilisez Response.Redirect, la page demandée est "temporairement" redirigée vers une page non trouvée. Ce n'est pas bon... 302 n'est pas une bonne idée.
Vous pouvez également vérifier cet article pour plus de détails