IIS6 vs. IIS7 i IIS7.5: obsługa adresów URL ze znakiem plus (+) w bazie (bez kwerendy)

38

W przypadku dowolnego adresu URL ze znakiem plus (+) w podstawowym adresie URL (nie w querystring), IIS7 i IIS7.5 (Windows Server 2008 i 2008 R2) nie wydają się przekazywać adresu URL do domyślnej procedury obsługi w aplikacji ASP.NET . Zacząłem zauważać problem z włączoną niestandardową obsługą HTTP, *.htmlale mam ten sam problem z *.aspx. IIS6 (Server 2003) nie ma problemu z tymi samymi adresami URL.

Aby powtórzyć problem, w witrynie ASP.NET utworzyłem zestaw plików ASPX, które wykonały prosty Response.Write o różnych nazwach:

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

Trzeci plik był testem sprawdzającym, czy IIS7 [.5] traktuje symbole dodatnie jako spacje (tak jak w przypadku kwerendy); wydaje się, że tak nie jest. Gdy wszystkie te pliki są na swoim miejscu, uderzenie http://somehost/test_some+thing.aspxlub http://somehost/test_some%2bthing.aspxbędzie działało poprawnie w IIS6, ale 404 w IIS7 / IIS7.5 przed przejściem do jakiegokolwiek programu obsługi ASP.NET. Czy w IIS7 / 7.5 jest jakaś konfiguracja, której brakuje, aby „zobaczyć” znak plus w adresie URL bez pominięcia końcowego rozszerzenia używanego do określenia procedury obsługi HTTP?

kaszka
źródło
Zastanawiam się, czy uniknięcie znaku plus pomogłoby. Może \+?
Wstrzymano do odwołania.

Odpowiedzi:

39

Po wyszukaniu większej liczby kombinacji IIS i plusa wydaje się, że IIS7 [.5] jest skonfigurowany tak, aby domyślnie odrzucał adresy URL ze znakiem plus z obawy przed użyciem tego znaku; ten symbol jest jednak nadal dozwolony w pytaniu. Rozwiązaniem jest zmiana domyślnego atrybutu requestFiltering na <system><webServer><security><requestFiltering>umożliwienie podwójnie kodowane znaki z połączenia linii poleceń (ostatecznie modyfikowania ASP.NET web.config):

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

Może to być nieco bardziej niebezpieczne, niż ktoś woli być na swojej stronie internetowej, ale nie wydaje się, aby istniał sposób bardziej szczegółowy niż pozwala na to koc. Ostrzeżenia dotyczyły niedopasowania, które może wystąpić między użyciem plusa w adresie URL a jego typowym tłumaczeniem jako spacją. Wygląda na to, że jedyną alternatywą jest całkowite zaprzestanie używania znaków plus w adresach URL.

kaszka
źródło
2
Tylko do Twojej wiadomości: nie musisz tego robić na szablonie poziomu głównego. Można to zrobić w dowolnym pliku Web.config lub zastosować do podfolderu za pomocą znacznika <location />.
mdonatas
W Menedżerze usług IIS: Witryny => Twoja strona => Filtrowanie żądań => Edytuj ustawienia funkcji ... => Zaznacz pole wyboru Zezwól na podwójne zmiany znaczenia => OK
diynevala
9

Właśnie wymyśliłem, jak stworzyć regułę przepisywania w celu przekonania IIS7 do mapowania plusów do spacji w adresach URL. W moim przypadku było to utrzymanie starszych zakładek lub hiperłączy.

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

Zobacz mój blog na dalsze szczegóły i referencje.

Nathan
źródło
1
Rozwiązałem problem polegający na tym, że musiałem obsługiwać starsze adresy URL ze znakami plus w ciągu zapytania, używając tylko powyższej sekcji dotyczącej bezpieczeństwa, tj. Ustawienie allowDoubleEscaping na „True”.
Stephen
Mam wyjątkowy przypadek - niektóre starsze adresy URL mają dwa kolejne plusy, tj. „++”. Wydaje się, że IIS ma wobec tego specjalną zasadę. jakieś pomysły?
boomhauer,
@boomhauer może być konieczne napisanie modułu obsługi ... lub użycie innego serwera do obsługi tych adresów URL? Pewnego razu zmusiłem Apache mod_rewrite do obsługi kilku starszych adresów URL i przekierowania ich do różnych nowych miejsc, i wydawało się to trochę bardziej elastyczne.
Nathan