IIS6 vs. IIS7 e IIS7.5: gestione degli URL con segno più (+) in base (non querystring)


39

Per qualsiasi URL con un segno più (+) nell'URL di base (non la stringa di query), IIS7 e IIS7.5 (Windows Server 2008 e 2008 R2) non sembrano inoltrare l'URL al gestore predefinito in un'applicazione ASP.NET . Ho iniziato a notare il problema con un gestore HTTP personalizzato attivo *.htmlma ho lo stesso problema con *.aspx. IIS6 (Server 2003) non ha problemi con questi stessi URL.

Per replicare il problema, in un sito ASP.NET, ho creato una serie di file ASPX che eseguivano un semplice Response.Write con vari nomi:

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

Il terzo file è stato un test per vedere se IIS7 [.5] trattava i simboli plus come spazi (come farebbe nella stringa di querystring); questo non sembra essere il caso. Con tutti questi file in atto, colpire http://somehost/test_some+thing.aspxo http://somehost/test_some%2bthing.aspxfunzionerà bene in IIS6 ma 404 in IIS7 / IIS7.5 prima di arrivare a qualsiasi gestore ASP.NET. C'è qualche configurazione in IIS7 / 7.5 che mi manca per far sì che "veda" un segno più nell'URL senza perdere l'estensione finale utilizzata per determinare un gestore HTTP?


Mi chiedo se sfuggire al segno più sarebbe di aiuto. Forse \+?
In pausa fino a nuovo avviso.

Risposte:


40

Dopo aver cercato più combinazioni di IIS e plus, sembra che IIS7 [.5] sia impostato per rifiutare gli URL con un segno più di default per paura dell'uso di quel personaggio; quel simbolo è ancora consentito nella stringa di query, però. La soluzione è quella di modificare l'attributo requestFiltering di default <system><webServer><security><requestFiltering>per consentire caratteri doppiamente codificati con una chiamata da riga di comando (modificando infine il tuo web.config ASP.NET):

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

Questo può essere un po 'più pericoloso di quanto si preferisca stare con il proprio sito Web, ma non sembra esserci un modo per essere più specifico di quanto una coperta lo consenta. Gli avvertimenti riguardavano la mancata corrispondenza che poteva verificarsi tra l'utilizzo di un plus in un URL e la sua traduzione tipica come spazio. Sembra che l'unica altra alternativa sia smettere di usare più i caratteri nei tuoi URL.


2
Solo un FYI: non è necessario farlo sul modello di livello principale. Questo può essere fatto in qualsiasi file Web.config o applicato a una sottocartella con un tag <location />.
mdonatas,

In Gestione IIS: Sites => YourSite => Request Filtering => Modifica impostazioni funzionalità ... => Seleziona Consenti doppio escape => OK
diynevala

9

Ho appena capito come creare una regola di riscrittura per convincere IIS7 a mappare i plus agli spazi negli URL. Nel mio caso è stato quello di far funzionare i segnalibri o i collegamenti ipertestuali legacy.

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

Vedi il mio post sul blog per ulteriori dettagli e riferimenti.


1
Ho risolto un problema in cui dovevo supportare URL legacy con segni più nella stringa di query utilizzando solo la sezione di sicurezza sopra, ovvero impostando allowDoubleEscaping su "True".
stephen,

Ho un caso unico: alcuni URL legacy hanno due aspetti sequenziali, ovvero "++". Sembra che IIS abbia una regola speciale contro questo. qualche idea?
boomhauer,

@boomhauer potresti dover scrivere un gestore ... o utilizzare un server web diverso per ospitare quegli URL? Una volta ho fatto in modo che Apache mod_rewrite gestisse un sacco di URL legacy e li reindirizzasse in vari nuovi posti, e sembrava un po 'più flessibile.
Nathan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.