IIS6 vs. IIS7 und IIS7.5: Verarbeiten von URLs mit Pluszeichen (+) in der Basis (nicht Querystring)

38

Bei URLs mit einem Pluszeichen (+) in der Basis-URL (nicht im Querystring) wird die URL von IIS7 und IIS7.5 (Windows Server 2008 und 2008 R2) scheinbar nicht an den Standardhandler einer ASP.NET-Anwendung weitergeleitet . Ich bemerkte das Problem mit einem benutzerdefinierten HTTP-Handler, *.htmlaber ich habe das gleiche Problem mit *.aspx. IIS6 (Server 2003) hat kein Problem mit denselben URLs.

Um das Problem zu replizieren, habe ich auf einer ASP.NET-Site eine Reihe von ASPX-Dateien erstellt, die eine einfache Response.Write mit verschiedenen Namen ausführten:

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

Die dritte Datei war ein Test, um festzustellen, ob IIS7 [.5] Pluszeichen als Leerzeichen behandelt (wie im Querystring). dies scheint nicht der Fall zu sein. Mit all diesen Dateien an Ort und Stelle, Schlagen http://somehost/test_some+thing.aspxoder http://somehost/test_some%2bthing.aspxwird gut in IIS6 arbeiten , aber 404 in IIS7 / IIS7.5 vor einem ASP.NET - Handler zu bekommen. Gibt es eine Konfiguration in IIS7 / 7.5, die ich vermisse, um ein Pluszeichen in der URL zu "sehen", ohne die letzte Erweiterung zu verpassen, die zum Bestimmen eines HTTP-Handlers verwendet wird?

Patridge
quelle
Ich frage mich, ob das Pluszeichen helfen würde. Vielleicht \+?
Bis auf weiteres angehalten.

Antworten:

39

Nach der Suche nach weiteren Kombinationen von IIS und Plus scheint IIS7 [.5] so eingerichtet zu sein, dass URLs mit einem Pluszeichen standardmäßig abgelehnt werden, da die Verwendung dieses Zeichens befürchtet wird. Dieses Symbol ist im Querystring jedoch weiterhin zulässig. Die Lösung besteht darin, die Standardeinstellung für das requestFiltering-Attribut so zu ändern <system><webServer><security><requestFiltering>, dass doppelt codierte Zeichen mit einem Befehlszeilenaufruf zulässig sind (wodurch letztendlich Ihre ASP.NET-Datei web.config geändert wird):

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

Dies mag ein bisschen gefährlicher sein, als man es von ihrer Website gewohnt ist, aber es schien keinen Weg zu geben, spezifischer zu sein als es eine Decke erlaubt. Die Warnungen betrafen die Nichtübereinstimmung, die zwischen der Verwendung eines Pluszeichens in einer URL und der typischen Übersetzung als Leerzeichen auftreten kann. Es sieht so aus, als ob die einzige Alternative darin besteht, die Verwendung von Pluszeichen in Ihren URLs zu beenden.

Patridge
quelle
2
Nur zu Ihrer Information: Sie müssen dies nicht auf der Stammebenenvorlage tun. Dies kann in jeder Web.config-Datei erfolgen oder auf einen Unterordner mit einem <location /> -Tag angewendet werden.
mdonatas
Im IIS-Manager: Sites => YourSite => Anforderungsfilterung => Funktionseinstellungen bearbeiten ... =>
Markieren
9

Ich habe gerade herausgefunden, wie man eine Regel zum Umschreiben erstellt, um IIS7 davon zu überzeugen, Pluspunkte Leerzeichen in URLs zuzuordnen. In meinem Fall sollten ältere Lesezeichen oder Hyperlinks weiterhin funktionieren.

<?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>

Weitere Details und Referenzen finden Sie in meinem Blogbeitrag .

Nathan
quelle
1
Ich habe ein Problem behoben, bei dem ich ältere URLs mit Pluszeichen in der Abfragezeichenfolge unterstützen musste, indem ich nur den obigen Sicherheitsabschnitt verwendet habe, dh indem ich allowDoubleEscaping auf "True" gesetzt habe.
Stephen
Ich habe einen einzigartigen Fall - einige alte URLs haben zwei aufeinanderfolgende Plusses, dh "++". IIS scheint dagegen eine Sonderregel zu haben. irgendwelche Ideen?
Boomhauer
@boomhauer müssen Sie möglicherweise einen Handler schreiben ... oder einen anderen Webserver zum Hosten dieser URLs verwenden? Einmal habe ich Apache mod_rewrite dazu gebracht, eine Reihe von alten URLs zu verarbeiten und sie an verschiedene neue Stellen weiterzuleiten, und es schien etwas flexibler zu sein.
Nathan