Pregunta

Estoy usando el Mod Rewrite para IIS 7.0 iis.net y desea redirigir las peticiones:

He creado 2 reglas:

<rule name="ID">
   <match url="/users/([0-9])" />
   <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
   <match url="/users/([a-z])" ignoreCase="true" />
   <action type="Rewrite" url="/User.aspx?name={R:1}" />
</rule>

Pasa una prueba en iis mmc de diálogo prueba, pero no en la depuración (URL como http://localhost:9080/example.com/users/1 o .../usuarios/foo) y no en el real de IIS!

¿Qué he hecho mal?

¿Fue útil?

Solución

El problema obvio es que sus expresiones regulares actuales solo coinciden con un carácter en el nombre de usuario o un número. Deberá agregar un cuantificador más dentro de los paréntesis para que coincida con varias letras o números. Consulte esta página para obtener más información sobre cuantificadores de expresiones regulares. Tenga en cuenta que no coincidirá con URL simples como & Quot; / users / & Quot; (sin identificación o nombre). Asegúrese de que esto es lo que pretendía.

El otro problema con el que se encuentra es que IIS evalúa las reglas de reescritura a partir del primer carácter después de la barra diagonal inicial. Por lo tanto, su regla para que coincida con /users/([0-9]) no coincidirá con nada porque cuando se realiza la evaluación de expresiones regulares, la URL parece users/foo no /users/foo. La solución es usar ^ (que es el carácter regex que significa & Quot; inicio de cadena & Quot;) al comienzo del patrón en lugar de una barra diagonal. Así:

<rule name="ID">
    <match url="^users/([0-9]+)" />
    <action type="Rewrite" url="/User.aspx?id={R:1}" />
</rule>
<rule name="Name">
    <match url="^users/([a-z]+)" ignoreCase="true" />
    <action type="Rewrite" url="/Users.aspx?name={R:1}" />
</rule>

Tenga en cuenta que está eligiendo Users.aspx para una de estas URL y User.aspx (sin plural) para la otra. Asegúrese de que esto es lo que pretendía.

Por cierto, la forma en que descubrí estas cosas fue usando Rastreo de solicitud de error de IIS para solucionar problemas de reescritura de reglas . Esto hizo que diagnosticar esto sea realmente fácil. Pude hacer una solicitud de prueba y mirar a través de la traza para encontrar dónde se evalúa cada regla de reescritura (está en una sección de la traza llamada & Quot; PATTERN_MATCH & Quot ;. Para el PATTERN_MATCH particular para uno de sus reglas, vi esto:

  

-PATTERN_MATCH
  Patrón / usuarios / ([0-9] +?)
  Usuarios de InputURL / 1
  Negate falso
  Igualado falso

Tenga en cuenta la falta de la barra diagonal inicial.

Otros consejos

Usted debe utilizar <match url="/users/([0-9]+)" /> y <match url="/users/([a-z]+)" ignoreCase="true" />, respectivamente, para que coincida con la completa id/usuario y no sólo su primera letra/dígito.Pero no sé por qué su regex habría fallado en un solo dígito, por lo que debe haber otro problema, también.

En cuanto a tu segunda pregunta, no estoy seguro de entender completamente.¿Cómo puede usted decir la diferencia entre el nombre de una carpeta y un nombre de usuario?Será una carpeta siempre tienen una barra diagonal?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top