IIS6 vs. IIS7 e IIS7.5: manejo de URL con signo más (+) en la base (no cadena de consulta)

39

Para cualquier URL con un signo más (+) en la URL base (no la cadena de consulta), IIS7 e IIS7.5 (Windows Server 2008 y 2008 R2) no parecen reenviar la URL al controlador predeterminado en una aplicación ASP.NET . Comencé a notar el problema con un controlador HTTP personalizado *.htmlpero tengo el mismo problema *.aspx. IIS6 (Server 2003) no tiene problemas con estas mismas URL.

Para replicar el problema, en un sitio ASP.NET, creé un conjunto de archivos ASPX que hicieron una simple Response.Write con varios nombres:

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

El tercer archivo era una prueba para ver si IIS7 [.5] estaba tratando los símbolos más como espacios (como lo haría en la cadena de consulta); Esto no parece ser el caso. Con todos estos archivos en su lugar, golpear http://somehost/test_some+thing.aspxo http://somehost/test_some%2bthing.aspxfuncionará bien en IIS6 pero 404 en IIS7 / IIS7.5 antes de llegar a cualquier controlador ASP.NET. ¿Hay alguna configuración en IIS7 / 7.5 que me falta para que "vea" un signo más en la URL sin perder la extensión final utilizada para determinar un controlador HTTP?

patridge
fuente
Me pregunto si escapar del signo más ayudaría. Tal vez \+?
Pausado hasta nuevo aviso.

Respuestas:

40

Después de buscar más combinaciones de IIS y más, parece que IIS7 [.5] está configurado para rechazar las URL con un signo más de forma predeterminada por temor al uso de ese carácter; sin embargo, ese símbolo todavía está permitido en la cadena de consulta. La solución es alterar el atributo requestFiltering predeterminado <system><webServer><security><requestFiltering>para permitir caracteres doblemente codificados con una llamada de línea de comando (en última instancia, modificando su ASP.NET web.config):

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

Esto puede ser un poco más peligroso de lo que uno prefiere estar con su sitio web, pero no parece haber una forma de ser más específico de lo que permite una manta. Las advertencias se referían a la falta de coincidencia que podría ocurrir entre el uso de un signo más en una URL y su traducción típica como espacio. Parece que la única otra alternativa es dejar de usar más caracteres en sus URL.

patridge
fuente
2
Solo un FYI: no tiene que hacer esto en la plantilla de nivel raíz. Esto puede hacerse en cualquier archivo Web.config o aplicarse a una subcarpeta con una etiqueta <location />.
mdonatas
En el Administrador de IIS: Sitios => YourSite => Solicitud de filtrado => Editar configuración de
funciones
9

Acabo de descubrir cómo hacer una regla de reescritura para convencer a IIS7 de que asigne ventajas a espacios en las URL. En mi caso, era para mantener funcionando los marcadores o hipervínculos heredados.

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

Vea mi publicación de blog para más detalles y referencias.

Nathan
fuente
1
Resolví un problema en el que tenía que admitir URL heredadas con signos más en la cadena de consulta utilizando solo la sección de seguridad anterior, es decir, estableciendo allowDoubleEscaping en "True".
Stephen
Tengo un caso único: algunas URL heredadas tienen dos ventajas secuenciales, es decir, "++". IIS parece tener una regla especial en contra de esto. ¿algunas ideas?
boomhauer
@boomhauer, ¿es posible que necesite escribir un controlador ... o usar un servidor web diferente para alojar esas URL? Una vez hice que Apache mod_rewrite manejara un montón de URL heredadas y las redirigiera a varios lugares nuevos, y parecía un poco más flexible.
Nathan