es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

enter image description here

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

Tags:  , , ,

Answer

  1. Avatar for 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ámetro t, la URL tiene tres segmentos. Para solucionar esto, debes modificar el patrón regex en el atributo match url del elemento rule para permitir tres segmentos:

    <match url="^([^/]+)/([^/]+)/([^/]+)?$"></match>
    

    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 establecer appendQueryString en falso. Si deseas incluir el parámetro t en la URL reescrita, debes establecer appendQueryString en verdadero:

    <action type="Rewrite" url="/city.aspx?r={R:1}&c={R:2}&t={R:3}" appendquerystring="true"></action>
    

    Con estas modificaciones, la URL reescrita debería funcionar correctamente incluso si se incluye el parámetro t.

Comments are closed.