IIS Rewrite, rewrite maps y query strings

10

Por favor, ayúdame a entender reescribir mapas, tengo esta configuración:

<rewriteMap name="MyMap">
   <add key="/pages" value="/website/pages/index.aspx" />
   <add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
   <add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>

Aquí está mi regla:

<rule name="Rewrite rule for MyMap" stopProcessing="true">
   <match url=".*" />
   <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      <add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

Esto funciona si intento acceder a estas páginas:

  • www.midominio.com/páginas (OK)
  • www.midominio.com/pages/page-1 (OK)
  • www.midominio.com/pages/page-1/section-1 (OK)

Pero quiero la posibilidad de agregar una cadena de consulta en cualquiera de estas páginas, por ejemplo:

  • www.mydomain.com/pages?page=1 (FAIL)

Cuando intento acceder a esta página, obtengo un 404. ¿Cómo puedo hacer que esto funcione?

Martín
fuente

Respuestas:

12

Por defecto, las reglas de reescritura de URL que usan mapas de reescritura se crean coincidiendo en la variable {REQUEST_URI} . Esto incluye la URL + la cadena de consulta. Esto le permite hacer coincidir las URL con los parámetros de la cadena de consulta y volver a escribirlas en otras páginas. Muy útil, pero aparentemente no es lo que quieres / necesitas.

Solo desea coincidir con la URL, sin la cadena de consulta. Para cambiar esto, debe reemplazar {REQUEST_URI} en la condición de {URL} . Entonces solo la URL (sin cadena de consulta) se comparará con el mapa de reescritura. Luego puede agregar la cadena de consulta a la URL reescrita para que el script ejecutado aún tenga acceso a ella.

Terminas con una regla como:

<rule name="Rewrite rule for MyMap">
    <match url=".*" />
    <conditions>
        <add input="{MyMap:{URL}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Marco Miltenburg
fuente
1
Gran explicación También me había estado preguntando cómo ignorar la QueryString para propósitos de coincidencia.
dthrasher