4 votes

Les points de fin d'url entraînent l'affichage d'une page 404 vide sur IIS

J'ai un site ASP.NET sur IIS8, mais IIS7.5 se comporte exactement de la même manière. Lorsque j'entre une URL comme :

mysite.com/foo/bar..

J'obtiens l'erreur suivante avec un code d'état "500 Internal Server Error" :

enter image description here

même si j'ai des pages d'erreur personnalisées pour 500 et 404 et que je ne vois rien d'anormal dans ma page d'erreur personnalisée.

Dans mon nœud web.config system.web, j'ai ce qui suit :

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

Si je supprime cette section, j'obtiens une réponse 404.0, mais la page elle-même est vide.

Dans web.config system.webServer j'ai :

<httpErrors errorMode="DetailedLocalOnly">
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" prefixLanguageFilePath="" path="404.html" responseMode="File" />
</httpErrors>

Mais que ce soit là ou non, j'obtiens la même page blanche 404.0 au lieu de la page d'erreur personnalisée que j'attendais, ou au moins un message interne d'IIS.

Tout d'abord, pourquoi le handler asp.net prend-il en compte une requête pour " " (fonctionne également avec un ou plusieurs points à la fin) ?

Si je supprime le gestionnaire suivant du fichier applicacationHost.config :

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />

J'obtiens la page 404 personnalisée attendue, mais bien sûr la suppression de ce gestionnaire casse le routage dans asp.net entre autres choses.

En regardant la trace de l'échec, je vois :

enter image description here

L'authentification Windows est désactivée pour le site, alors pourquoi ce module se trouve-t-il dans le pipeline de requêtes ?

Pour l'instant, ma solution consiste à utiliser le module URL Rewrite avec la règle suivante :

<rewrite>
    <rules>
        <rule name="Trailing Dots" stopProcessing="true">
            <match url="\.+$" />
            <action type="Rewrite" url="/404.html" appendQueryString="false" />
        </rule>
    </rules>
</rewrite> 

Cela fonctionne bien, mais je me demande pourquoi IIS/ASP.NET se comporte ainsi.

5voto

Bagherani Points 141

L'ajout de cet attribut dans le httpRuntime peut vous aider :

<configuration>
  <system.web>
    <httpRuntime ... relaxedUrlToFileSystemMapping="true" .../>
  </system.web>
</configuration>

Obtient ou définit une valeur indiquant si l'URL d'une requête HTTP doit être un chemin de fichier Windows valide.

Plus d'informations sur relaxedUrlToFileSystemMapping

3voto

jonathanpeppers Points 103

Il existe un KB à ce sujet : http://support.microsoft.com/kb/2520479

Le résultat est qu'il y a un problème d'ordre des opérations où les gestionnaires .NET pour les différentes fonctions se mélangent et font des erreurs d'orientation. Certains des gestionnaires .NET réécrivent l'URL sous une forme sans extension et peuvent perturber d'autres choses.

La solution de contournement consiste à déplacer tous les gestionnaires "ExtensionlessUrlHandler" à la toute fin de la liste, après tous les gestionnaires personnalisés que vous avez ajoutés et qui pourraient toucher les données PathInfo.

Il se peut que cette solution ne corresponde pas exactement à votre erreur, mais elle vaut la peine d'être essayée. N'oubliez pas que l'ordre des gestionnaires est configuré par l'ordre ADD dans ApplicationHost.Config et les fichiers de configuration associés !

1voto

andyvan Points 11

Je ne peux pas vous donner de réponse sur la raison pour laquelle le framework dotnet présente ce comportement ennuyeux. C'est un peu comme s'il traitait le 404 comme un 404 géré et sautait la page 404 par défaut d'IIS. Peut-être qu'il définit :

Response.IisTrySkipIisCustomErrors

Documents Microsoft

Quoi qu'il en soit, lorsque j'ai mis en œuvre votre règle, j'ai modifié votre expression rationnelle pour qu'elle prenne en charge un élément de fin de phrase, à savoir . suivi d'un / .

par exemple

https://localhost/investing./

Je l'ai mis à jour pour prendre en charge une barre oblique optionnelle.

<rule name="Trailing Dots" stopProcessing="true">
    <match url="\.+/?$" />
    <action type="Rewrite" url="/404.html" appendQueryString="false" />
  </rule>

J'aurais bien ajouté ce commentaire, mais je n'ai pas le rang pour le faire.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X