web-dev-qa-db-fra.com

Comment retourner une page personnalisée 404?

Si une erreur survient sur mon site Web, je procède comme suit:

        Server.Transfer("/error.aspx");

et cette page a le code:

protected void Page_Load(object sender, EventArgs e)
{
    ...

    Response.StatusCode = 404;
}

Si je travaille sur l'hôte local, puis avec le statut 404 renvoyé pour la page, la page affiche la description de l'erreur appropriée.

Une fois que j'ai publié le même code sur Internet, toutes les pages contenant des erreurs s'affichent toujours avec le code de statut 404, mais n'en contiennent pas le contenu. Au lieu de cela, ils ont le message d'erreur 404 standard:

404 - Fichier ou répertoire introuvable.

si la ligne "Response.StatusCode = 404" est commentée, la page appropriée est fournie, mais elle comporte un code de statut 200.

Question: comment retourner une page d'erreur conviviale qui, dans le même temps, a un code d'état d'erreur 404?

Toutes les pensées sont les bienvenues! Merci beaucoup d'avance!

P.S. ASP.NET 4.0

15
Budda
<customErrors mode="On" defaultRedirect="~/Error/GenericErrorPage.aspx">

     <error statusCode="404" redirect="~/Error/404.aspx" />

</customErrors>

http://msdn.Microsoft.com/en-us/library/h0hfz6fc(v=vs.71).aspx

http://msdn.Microsoft.com/en-us/library/aa479319.aspx

14
adt

Un ha!

Essaye ça:

Response.TrySkipIisCustomErrors = true;
Response.Status = "404 Not Found";
Response.StatusCode = 404;

J'ai trouvé dès que j'ai ajouté Response.TrySkipIisCustomErrors=true avant de définir le code d'état, je verrais la copie de page normale ET un 404 est renvoyé. Sans cette ligne, la page standard IIS 404 est affichée.

Cela peut également être défini dans le fichier web.config comme suit:

<system.webServer>
    <httpErrors existingResponse="PassThrough">
        // custom error page mappings
    </httpErrors>
</system.webServer>

La chose clé ici est existingResponse="PassThrough"

Cela a été ajouté à IIS7 et est donc requis sur les sites exécutés en mode Pipeline intégré.

Pour plus d'informations: http://msdn.Microsoft.com/en-us/library/system.web.httpresponse.tryskipiiscustomerrors.aspx

Update Mise à jour pour clarrification/plus d’informations car les utilisateurs le trouvent toujours utile. Il est intéressant de noter que si vous avez besoin d’une page 404 générique et simple, utilisez la méthode web.config (et faites-en une bonne page HTML).

La méthode que je décris fonctionne mieux si vous avez un site très dynamique ou géré par un système de gestion de contenu où une page donnée peut potentiellement renvoyer un 404 mais vous souhaitez afficher des informations relatives à vos visiteurs.

Par exemple, une page d'offres spéciales (offres/une-offre) peut rechercher une offre (une offre) et, si elle n'existe pas, afficher des offres alternatives ou connexes tout en retournant un 404 sous le capot. Pour autant que le visiteur sache, on vient de lui dire que l'offre n'est plus disponible, mais ils figurent toujours dans la section des offres, mais nous demandons également aux robots de désindexer l'URL. beaucoup plus difficile à faire s’il n’y avait qu’une seule page générique 404.

10
Jag

Vous pouvez y parvenir en configurant votre fichier web.config. Veuillez vérifier le lien ci-dessous vers un article, qui explique en bas de la page comment afficher différentes pages d'erreur personnalisées pour différents statuts d'erreur HTTP.

6
utsikko

Pour afficher votre page personnelle avec le correct 404 statuscode, vous pouvez utiliser le code suivant:

1) Dans votre web.config, ajoutez ce qui suit:

<customErrors mode="On" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="404.htm" />
</customErrors>

et:

<httpErrors errorMode="Custom">
  <remove statusCode="404"/>
  <error statusCode="404" path="404.htm" responseMode="File"/>
</httpErrors>

2) Ajoutez un fichier 404.htm à la racine de votre site web:

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>404 - Not Found</title>
    <meta http-equiv="refresh" content="5;url=/404-PAGE" />
  </head>
  <body>
       CONTENT
  </body>
</html>

Vous pouvez soit ajouter du contenu au corps de ce fichier et supprimer l’actualisation META, soit simplement utiliser l’actualisation META pour ouvrir une page de votre CMS.

3
Menderes

En combinant les réponses de Jag et Adt, j'avais toujours un problème. Lorsqu'un 404 était géré par le gestionnaire de fichiers statiques (par opposition à ASP.NET), j'ai reçu une réponse vide. (Le statut était correctement 404.)

Pour résoudre ce problème, j'ai dû ajouter errorMode="Custom" à l'élément <httpErrors>. Si votre page d'erreur utilise ASP.NET, vous devez inclure responseMode="ExecuteURL".

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error.aspx" redirectMode="ResponseRewrite" />
</system.web>

<system.webServer>
    <httpErrors errorMode="Custom">
        <remove statusCode="404" />
        <error statusCode="404" path="/Error.aspx" responseMode="ExecuteURL" />
    </httpErrors>
</system.webServer>
2
mm201
<httpErrors errorMode="Custom">
     <remove statusCode="404"/>
     <error statusCode="404" path="ErrorPages/error404.htm" responseMode="Redirect"/>
  </httpErrors>

Cela fonctionne pour moi si je n'utilise pas le tilde (~) dans l'attribut path

0
A.moizRiaz