82 votes

ASP.NET 404 Personnalisée de Retour de 200 OK, au Lieu de 404 not Found

Après une tentative d'installation de mon site à Google Webmaster Tools, j'ai trouvé que ma Personnalisé ASP.NET page 404 n'était pas de retourner le code d'état 404. Il affiche la bonne page personnalisée et dit au navigateur que tout est OK. C'est envisager un soft 404 ou faux 404. Google n'aime pas ça. Donc j'ai trouvé de nombreux articles sur la question, mais la solution que je veux n'a pas l'air de fonctionner.

La solution que j'ai envie de travailler est d'ajouter les deux lignes suivantes au code derrière méthode Page_Load de la page 404 personnalisée.

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

Cela ne fonctionne pas. La page renvoie toujours à 200 OK. J'ai trouvé cependant que si je code le code suivant dans la conception de code, il va fonctionner correctement.

<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">

<%
	Response.Status = "404 Not Found";
	Response.StatusCode = 404;
%>

 ... Much more code ...

</asp:content>

La page est à l'aide d'une page maître. Et je suis de la configuration des pages d'erreur personnalisées dans mon web.config. Je préférerais utiliser le code-behind de l'option mais je n'arrive pas à le faire fonctionner sans mettre un le hack de code en ligne dans la conception / mise en page.

73voto

Ryan Cook Points 5613

Solution:

Le problème, il s'est avéré, a été l'utilisation de la page maître. Je l'ai eu à travailler en définissant le statut de code plus tard, dans les pages du cycle de vie, évidemment, le rendu de la page principale a été de le réinitialiser, donc j'ai changé la méthode de rendu et de le régler après le rendu était complet.

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);
    Response.StatusCode = 404;
}

Plus de travail pourrait être fait pour savoir exactement quand le maître est la page de réglage de l'état, mais je vais laisser cela à vous.


Original Post:

J'ai été en mesure d'obtenir un test d'une application web de fonctionner correctement, eh bien, au moins affiche la page d'erreur personnalisée et a renvoyé un code d'état 404. Je ne peux pas vous dire quel est le problème avec votre application, mais je peux vous dire ce que j'ai fait:

1) Modifié le web.config pour les erreurs personnalisées:

<customErrors mode="On">
  <error statusCode="404" redirect="404.aspx"/>
</customErrors>

2) Ajout d'une 404.page aspx et de définir le code d'état 404.

public partial class _04 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.StatusCode = 404;
    }
}

C'est à ce sujet, si je vais à n'importe quelle page de l'extension qui est traité par Asp.Net et n'existe pas, mon fiddler journal montre clairement une erreur 404, voici l'en-tête:

HTTP/1.1 404 Not Found
Server: Microsoft-IIS/5.1
Date: Sun, 07 Dec 2008 06:04:13 GMT
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 533

Maintenant, si je vais sur une page qui n'est pas traité par Asp.Net comme un fichier htm, la coutume n'est pas le spectacle et la 404 qui est configuré par IIS est affiché.

Voici un post qui va dans un peu plus de détails que l'on peut utiliser pour vous et votre problème, mon test ne permet de faire une redirection vers la nouvelle page de l'url du fichier demandé est à peu près perdu (à l'exception de son dans la chaîne de requête).

http://stackoverflow.com/questions/152307/google-404-and-net-custom-error-pages

L'En-Tête Espion Réponse:

HTTP/1.1 404 Not Found
Date: Sun, 07 Dec 2008 06:21:20 GMT

29voto

gary Points 425

J'ai eu un problème similaire, je veux vous montrer une page personnalisée comme une erreur 404 (qui est ASPX) et il a bien fonctionné sur localhost, mais dès qu'une distance visiteur s'est connecté qu'ils obtiendraient le générique IIS 404.

La solution à ce problème est d'ajouter

Response.TrySkipIisCustomErrors = true;

Avant de changer la Réponse.StatusCode.

Trouvé par Rick Strahl http://www.west-wind.com/weblog/posts/745738.aspx

12voto

Nick D Points 71

IIS 7 solution est de les ajouter à votre site web.fichier de configuration:

<system.webServer>
  <httpErrors existingResponse="Replace">
    <remove statusCode="500" subStatusCode="-1" />
    <remove statusCode="404" subStatusCode="-1" />
    <error statusCode="404" prefixLanguageFilePath="" path="404.htm" responseMode="File" />
    <error statusCode="500" prefixLanguageFilePath="" path="500.htm" responseMode="File" />
  </httpErrors>
</system.webServer>

http://forums.asp.net/t/1563128.aspx/1

12voto

Jason Goemaat Points 7211

Essayez d'appeler de Réponse.Fin() pour sauter rendu...

Response.Status = "404 Not Found";
Response.StatusCode = 404;
Response.End();
return;

9voto

Bobby Cannon Points 1711

Après beaucoup d'essais et de dépannage, il semble que certains fournisseurs d'hébergement peuvent interférer avec le code de retour. J'ai été en mesure de contourner ce problème par l'application d'un "hack" dans le contenu.

<%
// This code is required for host that do special 404 handling...
Response.Status = "404 Not Found";
Response.StatusCode = 404;
%>

Cela permettra de la page pour retourner le bon code de retour n'importe quoi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X