Quelle est la différence entre les sections customErrors
et httpErrors
du fichier web.config dans les applications ASP.NET MVC?
Quelles sont les directives d'utilisation de chaque section?
Disclaimer: Ceci est de mon expérience et fait non prouvé.
Les deux sont utilisés pour définir le traitement des erreurs pour un site Web, mais des logiciels différents font référence à des éléments de configuration différents.
customErrors
sont un élément hérité (à compatibilité ascendante), utilisé par le serveur de développement Visual Studio (alias VSDS ou Cassini).
httpErrors
sont le nouvel élément utilisé uniquement par IIS7.
Cela met en évidence le problème possible lors du développement de sites Web ASP.NET avec VSDS au lieu du système IIS local.
En outre, référez-vous à ce message par moi-même pour savoir comment gérer les messages d'erreur avec IIS7, si vous souhaitez avoir le contrôle total de la sortie d'erreur.
VSDS
- utiliser customErrors
IIS6
- utilise customErrors
IIS7
_ - utilise httpErrors
.et si vous développez avec VSDS
mais publiez vers IIS7
, alors je suppose que vous aurez besoin des deux.
* Mis à jour en avril 2016
L'attribut customErrors est utilisé lorsque le code .net génère une exception (404, 403, 500, etc.) et que l'attribut httpErrors est utilisé lorsque IIS est lui-même lancer une exception.
Il y a beaucoup de pièges à essayer pour configurer ceci correctement. Donc, si vous recherchez un exemple rapide, les 2 meilleures options que vous puissiez utiliser sont les suivantes:
Exemple 1: utilisation de pages HTML
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.html" />
<error statusCode="404" redirect="/Error404.html" />
<error statusCode="500" redirect="/Error500.html" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="File" path="Error403.html" />
<error statusCode="404" responseMode="File" path="Error404.html" />
<error statusCode="500" responseMode="File" path="Error500.html" />
</httpErrors>
</system.webServer>
Exemple 2: utilisation de pages aspx
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/Error500.html" redirectMode="ResponseRewrite">
<error statusCode="403" redirect="/Error403.aspx" />
<error statusCode="404" redirect="/Error404.aspx" />
<error statusCode="500" redirect="/Error500.aspx" />
</customErrors>
</system.web>
<system.webServer>
<httpErrors errorMode="DetailedLocalOnly" existingResponse="Auto">
<remove statusCode="403" />
<remove statusCode="404" />
<remove statusCode="500" />
<error statusCode="403" responseMode="ExecuteURL" path="Error403.aspx" />
<error statusCode="404" responseMode="ExecuteURL" path="Error404.aspx" />
<error statusCode="500" responseMode="ExecuteURL" path="Error500.aspx" />
</httpErrors>
</system.webServer>
Et dans les pages d'erreur aspx, vous devez faire quelque chose comme ceci (exemple de page 404):
<%
Response.StatusCode = 404;
Response.TrySkipIisCustomErrors = true;
%>
Remarque: L'utilisation d'URL sans extension dans la section customErrors est impossible! . (sans hacks)
Une solution consiste à désactiver les erreurs personnalisées et à laisser les erreurs http gérer la page personnalisée. Un ami a créé une telle configuration, quand je trouverai du temps, je partagerai le code.
Arrière-plan
Une bonne page d'erreur personnalisée va:
Donc, pour clarifier certaines options de notre configuration:
<customErrors mode="RemoteOnly"
. Vous pouvez spécifier ici: On
, Off
, RemoteOnly
.
On
= Toujours afficher les pages d'erreur personnaliséesOff
= Toujours afficher la véritable erreurRemoteOnly
= Affiche l'erreur localement, mais affiche la page d'erreur personnalisée à distance. Nous voulons donc RemoteOnly
pour l'instruction 1<customErrors redirectMode="ResponseRewrite"
. Vous pouvez spécifier ici: ResponseRedirect
ou ResponseRewrite
. Le mode ResponseRedirect
redirige la page d'erreur vers la page d'erreur personnalisée. Pour un crawler de liens (SEO), cela donnera 302 -> 500, mais vous voulez que le crawler de liens obtienne une erreur 500.
<httpErrors errorMode="DetailedLocalOnly"
. C'est l'équivalent du mode customErrors
. Les options que vous avez: Custom
, Detailed
, DetailedLocalOnly
.
Un bon article de blog qui m'a beaucoup aidé est: http://benfoster.io/blog/aspnet-mvc-custom-error-pages
<customErrors>
contre <httpErrors>
<customErrors>
<httpErrors>
Note: il n'est plus nécessaire d'utiliser
customErrors
Source citée: pages personnalisées et d'erreur dans ASP.NET (excellent article)
ExecuteURL
sert un contenu dynamique tel qu'une page .aspx (la valeur path
doit être une URL relative du serveur ) :
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL" >
<remove statusCode="404"/>
<error statusCode="404" responseMode="ExecuteURL" path="/error.aspx" />
</httpErrors>
</system.webServer>
File
sert un fichier d'erreur personnalisé, tel qu'une page .html:
<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="File" >
<remove statusCode="404"/>
<error statusCode="404" path="404.html" />
</httpErrors>
</system.webServer>
Référence: Erreurs HTTP (www.iis.net)
pour plus de détails, lisez le lien www.iis.net ci-dessus
La section Errors de Web Config est destinée à fournir une approche personnalisée de gestion des erreurs http. Il existe deux sections, une customErrors dans la section system.web et une autre httpErrors dans la section system.webServer (comme indiqué ci-dessous).
customErrors: Cette section était déjà utilisée auparavant IIS 7 introduit, IIS 6 5 et avant utilisez pleinement cette section pour la gestion des erreurs http personnalisées en fonction du code de statut http.
httpErrors: IIS 7 et les versions ultérieures utilisent cette section ainsi que customErrors section pour gérer les erreurs http personnalisées en fonction de leurs extensions de fichier si l'extension de page demandée s'inscrit avec ISAPI dll (.aspx, ashx, .asmx, .svc, etc.) comme index.aspx, puis IIS à prendre dans la section customeErrors , sinon il prend à partir de httpErrors (le mode hébergé IIS 7 doit être défini en tant qu'ambiance intégrée et non classique)
vous trouverez ci-dessous des exemples de liens de contrôle de gestion des erreurs 404: