Dans mon application Web ASP.NET, j'ai défini les pages d'erreur personnalisées dans mon fichier web.config comme suit:
<customErrors mode="On" defaultRedirect="~/default.html">
<error statusCode="404" redirect="~/PageNotFound.html" />
</customErrors>
Dans le cas d'une erreur 404, mon site redirige vers la page default.html
, mais il transmet "aspxerrorpath" en tant que paramètre de chaîne de requête à la page d'erreur personnalisée comme suit:
http://www.example.com/default.html?aspxerrorpath=/somepathcausederror/badpage.aspx
Je ne veux pas ce comportement. Je veux que l'URL de redirection se lise simplement:
http://www.example.com/default.html
Y a-t-il un moyen d'y parvenir?
Ma première idée serait de créer un gestionnaire HttpHandler qui capture les URL contenant aspxerrorpath
et les dépouille. Vous pouvez probablement faire la même chose avec le module de réécriture dans IIS7.
Si vous fournissez votre propre variable de chaîne de requête lors de la spécification du chemin, alors .NET n'acceptera PAS le chemin "aspxerrorpath". Qui savait?
Par exemple:
<customErrors mode="On" defaultRedirect="errorpage.aspx?error=1" >
Cela fera l'affaire . Je devais ajouter cela à un tas d'applications car URLScan pour IIS rejetait par défaut tout ce qui contenait "aspxerrorpath".
Dans le fichier global.asax, récupérez l'erreur 404 et redirigez-le vers la page du fichier non trouvé. Je n'avais pas besoin de l'aspxerrorpath et cela fonctionnait à merveille pour moi.
void Application_Error(object sender, EventArgs e)
{
Exception ex = Server.GetLastError();
if (ex is HttpException && ((HttpException)ex).GetHttpCode() == 404)
{
Response.Redirect("~/filenotfound.aspx");
}
else
{
// your global error handling here!
}
}
Vous pouvez simplement envoyer vos propres paramètres d'URL à la page d'erreur
<customErrors mode="On" defaultRedirect="~/default.html?404">
<error statusCode="404" redirect="~/PageNotFound.html?404" />
</customErrors>
Je pense que vous préféreriez implémenter/utiliser le Application_Error event dans Global.asax et y effectuer votre traitement/redirections.
Si vous appelez Server.ClearError dans ce gestionnaire, je ne pense pas qu'il utilisera la configuration customErrors.
J'utilise javascript comme
if (location.search != "") { window.location.href = "/404.html"; }
La meilleure solution (plus une solution de contournement ..) J'ai implémenté depuis maintenant pour éviter le problème aspxerrorpath
de continuer à utiliser le support ASP.NET CustomErrors, est une redirection vers l'action qui implémente la gestion des erreurs.
Voici quelques étapes de ma solution dans un contexte d'application Web ASP.NET MVC:
Commencez par activer le module des erreurs personnalisées dans web.config
<customErrors mode="On" defaultRedirect="~/error/500">
<error statusCode="404" redirect="~/error/404"/>
</customErrors>
Puis définissez une règle de routage:
routes.MapRoute(
name: "Error",
url: "error/{errorType}/{aspxerrorpath}",
defaults: new { controller = "Home", action = "Error", errorType = 500, aspxerrorpath = UrlParameter.Optional },
);
Enfin, implémentez l'action suivante (et les vues associées ..):
public ActionResult Error(int errorType, string aspxerrorpath)
{
if (!string.IsNullOrEmpty(aspxerrorpath)) {
return RedirectToRoute("Error", errorType);
}
switch (errorType) {
case 404:
return View("~/Views/Shared/Errors/404.cshtml");
case 500:
default:
return View("~/Views/Shared/Errors/500.cshtml");
}
}
Si vous supprimez aspxerrorpath =/et que vous utilisez la redirection de réponse lors de la gestion des erreurs, vous obtiendrez une exception, il y aura une boucle de redirection.