IIS6 vs. IIS7 e IIS7.5: manipulando URLs com sinal de adição (+) na base (não na string de consulta)

39

Para qualquer URL com um sinal de adição (+) na URL base (não na string de consulta), o IIS7 e o IIS7.5 (Windows Server 2008 e 2008 R2) não parecem encaminhar a URL para o manipulador padrão em um aplicativo ASP.NET . Comecei a perceber o problema com um manipulador HTTP personalizado, *.htmlmas tenho o mesmo problema *.aspx. O IIS6 (Server 2003) não tem problemas com esses mesmos URLs.

Para replicar o problema, em um site ASP.NET, criei um conjunto de arquivos ASPX que executavam um Response.Write simples com vários nomes:

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

O terceiro arquivo foi um teste para verificar se o IIS7 [.5] estava tratando símbolos mais como espaços (como faria na string de consulta); isso não parece ser o caso. Com todos esses arquivos no lugar, pressione http://somehost/test_some+thing.aspxou http://somehost/test_some%2bthing.aspxfuncionará bem no IIS6, mas 404 no IIS7 / IIS7.5 antes de chegar a qualquer manipulador do ASP.NET. Há alguma configuração no IIS7 / 7.5 que falta para que ele "veja" um sinal de mais na URL sem perder a extensão final usada para determinar um manipulador HTTP?

Patridge
fonte
Gostaria de saber se escapar do sinal de mais ajudaria. Talvez \+?
Pausado até novo aviso.

Respostas:

40

Depois de pesquisar por mais combinações do IIS e mais, parece que o IIS7 [.5] está configurado para rejeitar URLs com um sinal de mais por padrão, devido a algum receio do uso desse caractere; esse símbolo ainda é permitido na string de consulta. A solução é alterar o padrão do atributo requestFiltering <system><webServer><security><requestFiltering>para permitir caracteres duplamente codificados com uma chamada de linha de comando (modificando finalmente o seu asp.net web.config):

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

Isso pode ser um pouco mais perigoso do que se prefere no site, mas não parecia haver uma maneira de ser mais específico do que o permitido por um cobertor. Os avisos diziam respeito à incompatibilidade que poderia ocorrer entre o uso de um plus em um URL e sua tradução típica como espaço. Parece que a única outra alternativa é parar de usar mais caracteres nos seus URLs.

Patridge
fonte
2
Apenas um FYI: você não precisa fazer isso no modelo de nível raiz. Isso pode ser feito em qualquer arquivo Web.config ou aplicado a uma subpasta com uma marca <location />.
Mdonatas 7/08
No Gerenciador do IIS: Sites => YourSite => Solicitar filtragem => Editar configurações de recursos ... => Marque Permitir escape duplo => OK
diynevala 07/11
9

Acabei de descobrir como fazer uma regra de reescrita para convencer o IIS7 a mapear vantagens para espaços em URLs. No meu caso, era para manter favoritos ou hiperlinks legados funcionando.

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

Veja meu blog para mais detalhes e referências.

Nathan
fonte
1
Resolvi um problema em que tinha que suportar URLs herdadas com sinais de adição na string de consulta usando apenas a seção de segurança acima, ou seja, definindo allowDoubleEscaping como "True".
1811 Stephen
Eu tenho um caso único - alguns URLs herdados têm dois pontos seqüenciais, ou seja, "++". O IIS parece ter uma regra especial contra isso. alguma ideia?
boomhauer
@ boomhauer, pode ser necessário escrever um manipulador ... ou usar um servidor da web diferente para hospedar esses URLs? Uma vez, fiz o Apache mod_rewrite manipular um monte de URLs herdados e redirecioná-los para vários novos lugares, e parecia um pouco mais flexível.
Nathan