La reescritura de URL no funciona cuando se utilizan tres segmentos.
Este código funciona perfectamente para reescribir dos segmentos de la URL.
Por ejemplo:
/nottinghamshire/newark
Sin embargo, si agrego string t = Request.QueryString["t"].Replace("-", " ").ToLower().Replace(".aspx", "")
a la mezcla, es decir:
/nottinghamshire/newark/plumbers
Fallará y mostrará un error 404 como se muestra en la siguiente imagen:
¿Por qué funciona esto?
Web config:
<rule name="rewritereview">
<match url="^([^/]+)/([^/]+)?$"></match>
<conditions>
<add input="{REQUEST_FILENAME}" matchtype="IsFile" negate="true"></add>
<add input="{REQUEST_URI}" pattern=".js|.css|.img|.scimg" negate="true"></add>
</conditions>
<action type="Rewrite" url="/city.aspx?r={R:1}&c={R:2}&t={R:3}" appendquerystring="false"></action>
</rule>
Código en city.aspx.cs:
string r = Request.QueryString["r"].Replace("-", " ").ToLower();
string c = Request.QueryString["c"].Replace("-", " ").ToLower().Replace(".aspx","");
string t = Request.QueryString["t"].Replace("-", " ").ToLower().Replace(".aspx", "");
if (r != null && c != null && t !=null)
{
// llenar página
}
else
{
// ¿404?
}
¿Qué estoy haciendo mal?
davy.ai
Parece que el problema está en la forma en que se vuelve a escribir la
url
en el archivo web.config. La regla de reescritura espera solo dos segmentos en la URL, pero cuando agregas el parámetrot
, la URL tiene tres segmentos. Para solucionar esto, debes modificar el patrón regex en el atributomatch url
del elementorule
para permitir tres segmentos:Esto coincidirá con las URL que tienen tres segmentos, como
/nottinghamshire/newark/plumbers
.Además, el parámetro
t
se está eliminando de la URL reescrita al establecerappendQueryString
en falso. Si deseas incluir el parámetrot
en la URL reescrita, debes establecerappendQueryString
en verdadero:Con estas modificaciones, la URL reescrita debería funcionar correctamente incluso si se incluye el parámetro
t
.