Impossible de renvoyer l'état HTTP 404 pour la page d'erreur personnalisée dans ASP.NET
L'un de nos anciens sites Web basés sur la technologie ASP.NET classique a été déplacé vers un nouvel hébergement. Il s'agit maintenant d'un cloud exécutant Windows Azure Pack dans lequel notre site s'exécute sous .NET Framework 4.6.1.
Cependant, je ne peux toujours pas renvoyer une page d'erreur personnalisée pour une ressource .aspx non existante avec le statut HTTP correct 404 - le statut est toujours 302. À l'origine, la page d'erreur 404 personnalisée a été définie comme ceci dans web.config:
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
<error statusCode="404" redirect="/error/resource-not-found.aspx"/>
</customErrors>
</system.web>
J'ai lu des articles SO comme celui-ci et essayé les réponses suggérées, y compris la définition du redirectMode sur ResponseRewrite, mais rien n'a aidé ou n'a pas fonctionné comme prévu.
Ai-je manqué quelque chose ou y a-t-il une autre solution?
J'ai réussi à surmonter ce problème. Tout d'abord, j'ai désactivé la redirection pour l'erreur 404 dans web.config:
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/error/server-error.aspx">
<!-- <error statusCode="404" redirect="/error/resource-not-found.aspx"/> -->
</customErrors>
</system.web>
Ensuite, j'ai ajouté le gestionnaire d'événements Application_Error suivant à mon Global.asax:
Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
Dim serverError As HttpException = DirectCast(Server.GetLastError(), HttpException)
If Not serverError Is Nothing Then
If 404 = serverError.GetHttpCode() Then
Server.ClearError()
Server.Transfer("/error/resource-not-found.aspx")
End If
End If
End Sub
Enfin, j'ai ajouté les lignes ci-dessous à ma page Erreur 404. (resource-not-found.aspx):
Sub Page_Load()
' If you're running under IIS 7 in Integrated mode set,
' use this line to override IIS errors:
Response.TrySkipIisCustomErrors = True
Response.StatusCode = 404
Response.StatusDescription = "Page not found"
End Sub
Pour info: si vous utilisez la technologie MasterPage, seule la partie variable de votre MasterPage est redirigée. Après avoir joué avec des ressources inexistantes dans diverses sections de notre site Web, j'ai trouvé ce comportement intelligent et utile pour nos utilisateurs finaux.
UNE CHOSE DE PLUS. Pour renvoyer le code d'état HTTP 404 pour les ressources non ASPX, j'utilise le paramètre suivant dans mon web.config:
<system.webServer>
<httpErrors errorMode="Custom" defaultResponseMode="Redirect">
<remove statusCode="404"/>
<error statusCode="404" path="/error/resource-not-found.aspx" responseMode="ExecuteURL"/>
</httpErrors>
</system.webServer>
Faites attention au responseMode défini sur 'ExecuteURL' pour l'erreur 404.