2011-03-05 6 views
0

J'utilise un site Web CMS Sitefinity sur IIS 7. Je vois quelques résultats bizarres lorsque j'essaie de retourner un statut 404.IIS 7 Codes d'erreur

Si je vais à une URL comme:

www.mysitefinitywebsite.com/test.co.uk (Je sais que cela est une adresse invalide, mais quelqu'un est entré dans le CMS)

Comme le ci-dessus n'est pas une page ASPX, je crois que IIS gère l'erreur, avec le code suivant:

<httpErrors errorMode="Custom"> 
     <remove statusCode="404" subStatusCode="-1" /> 
     <error statusCode="404" prefixLanguageFilePath="" path="/404.aspx" responseMode="ExecuteURL" /> 
    </httpErrors> 

l'URL dans la barre d'adresse reste la même, ma page 404 de la page (/404.aspx) est affiché, cependant, un code d'état http 200 est renvoyé.

Si toutefois l'adresse suivante est tapé dans:

www.mysitefinitywebsite.com/test.aspx - le gestionnaire d'erreurs ASPX démarre avec la configuration suivante:

<customErrors mode="On" > 
    <error redirect="~/Sitefinity/nopermissions.aspx" statusCode="403" /> 
    <error redirect="~/404.aspx" statusCode="404" /> 
</customErrors> 

Encore une fois, ma 404 page est affichée, mais l'URL change dans la barre d'adresse:

www.mysitefinitywebsite.com/404.aspx?aspxerrorpath=/test.aspx

Et étrangement, si je vérifie Firebug, un code 302 est renvoyé pour text.aspx, puis un statut de 200 pour /404.aspx?aspxerrorpath=/test.aspx.

Je ne comprends pas complètement ce qui se passe ici, il semble que IIS ne répond pas du tout avec le code d'état - est-ce par conception? Semble complètement fou!

Si c'est par conception, la seule façon de le résoudre est probablement de retourner par programme le code de réponse correct?

Merci à l'avance higgsy

Répondre

0

Lorsque vous utilisez l'élément <httpErrors> et en utilisant executeUrl, vous êtes au service du contenu dynamique. Si ce contenu ne renvoie pas de façon explicite le code d'état (une page asp.net, asp, etc.), vous devez définir l'attribut existingResponse sur auto/replace/passthrough comme bon vous semble.

L'intention ici est que le serveur Web peut avoir une erreur générique et que vous souhaitiez renvoyer un code d'erreur différent ou étendu à vos clients. Cela fait plus de sens pour les API où vous voudrez peut-être un 404 pour contenir/retour plus d'informations sur ce qui n'a pas été trouvé, etc, etc.

Jetez un oeil à la documentation IIS.NET sur httpErrors pour le drapeau de existingResponse

http://www.iis.net/ConfigReference/system.webServer/httpErrors


Quant à ASP.NET, une redirection 302 en cas d'erreur est le comportement par défaut, ce qui est ce que vous voyez. Le 404 est renvoyé b/c la page que vous redirigez est définie par programme le code d'état de la réponse.

La différence est simplement causée par la manipulation. Dans la première, vous autorisez IIS à gérer l'erreur avant d'exécuter le canal ASP.NET. Dans la seconde, IIS passe au pipeline ASP.NET. Ils sont deux technologies différentes, d'où les deux comportements de différence.Rassurez-vous avec un peu de recherche, vous pouvez les faire tous les deux faire la même chose.