IIS6 contre IIS7 et IIS7.5: gestion des URL avec le signe plus (+) en base (sans chaîne de requête)

39

Pour toute URL avec un signe plus (+) dans l'URL de base (pas la chaîne de requête), IIS7 et IIS7.5 (Windows Server 2008 et 2008 R2) ne semblent pas transmettre l'URL au gestionnaire par défaut d'une application ASP.NET. . J'ai commencé à remarquer le problème avec un gestionnaire HTTP personnalisé, *.htmlmais j'ai le même problème avec *.aspx. IIS6 (Server 2003) n'a aucun problème avec ces mêmes URL.

Pour répliquer le problème, dans un site ASP.NET, j'ai créé un ensemble de fichiers ASPX faisant un simple Response.Write avec différents noms:

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_quelque chose.aspx

Le troisième fichier testait si IIS7 [.5] traitait les symboles plus comme des espaces (comme dans la chaîne de requête); cela ne semble pas être le cas. Avec tous ces fichiers en place, frapper http://somehost/test_some+thing.aspxou http://somehost/test_some%2bthing.aspxfonctionner correctement dans IIS6 mais 404 dans IIS7 / IIS7.5 avant d’arriver à un gestionnaire ASP.NET. Y-a-t-il une configuration dans IIS7 / 7.5 qui me manque pour la "voir" un signe plus dans l'URL sans manquer l'extension finale utilisée pour déterminer un gestionnaire HTTP?

patridge
la source
Je me demande si échapper au signe plus pourrait aider. Peut \+- être ?
pause jusqu'à nouvel ordre.

Réponses:

40

Après avoir recherché plus de combinaisons d'IIS et de plus, il apparaît que IIS7 [.5] est configuré pour rejeter les URL avec le signe plus par défaut, par crainte de l'utilisation de ce caractère. ce symbole est toujours autorisé dans la chaîne de requête, cependant. La solution consiste à modifier la valeur par défaut de l'attribut requestFiltering <system><webServer><security><requestFiltering>pour autoriser les caractères doublement codés avec un appel de ligne de commande (modifiant en définitive votre web.config ASP.NET):

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true

Cela peut paraître un peu plus dangereux que ce que l’on préfère avec son site Web, mais il ne semblait pas y avoir de moyen d’être plus précis que ce que permet une couverture. Les avertissements concernaient l'inadéquation possible entre l'utilisation d'un plus dans une URL et sa traduction classique sous forme d'espace. Il semble que la seule autre alternative consiste à cesser d'utiliser des caractères plus dans vos URL.

patridge
la source
2
Juste un FYI: Vous n'avez pas à faire cela sur le modèle de niveau racine. Cela peut être fait dans n'importe quel fichier Web.config ou appliqué à un sous-dossier avec une balise <location />.
Mdonatas
Dans le Gestionnaire IIS: Sites => YourSite => Filtrage des demandes => Modifier les paramètres de fonctionnalité ... => Cochez la
case
9

Je viens de comprendre comment créer une règle de réécriture pour convaincre IIS7 de mapper les avantages des espaces dans les URL. Dans mon cas, il s’agissait de conserver les anciens marque-pages ou hyperliens.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="True" />
    </security>
    <rewrite>
      <rules>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="false">
          <match url="\+" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Voir mon article de blog pour plus de détails et de références.

Nathan
la source
1
J'ai résolu un problème où je devais prendre en charge les anciennes URL avec des signes plus dans la chaîne de requête en utilisant uniquement la section de sécurité ci-dessus, à savoir la définition de allowDoubleEscaping sur "True".
Stephen
J'ai un cas unique - certaines URL héritées ont deux avantages séquentiels, à savoir "++". IIS semble avoir une règle spéciale contre cela. des idées?
boomhauer
@boomhauer, vous devrez peut-être écrire un gestionnaire ... ou utiliser un autre serveur Web pour héberger ces URL? Une fois, j'ai demandé à mod_rewrite d’Apache de gérer un ensemble d’URL héritées et de les rediriger vers de nouveaux emplacements, ce qui me semblait un peu plus flexible.
Nathan