.net asp.net web-config url-rewriting urlrewriter.net

¿Reescribiendo una URL que puede contener 1 o 2 cadenas de consulta con URLRewriter.NET?



asp.net web-config (3)

Esta es la solución final que hemos creado.

<rewriter> <rewrite url="^(/.+(/.gif|/.png|/.jpg|/.ico|/.pdf|/.css|/.js)(/?.+)?)$" to="$1" processing="stop"/> <rewrite url="^.+?([/d]+?)-([/d]+?)/.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> <rewrite url="^.+?-([/d]+?)/.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/> </rewriter>

  • La primera regla es sobre los tipos de archivos que no necesitamos.
  • La segunda regla es sobre "si la página obtiene 2 cadenas de búsqueda"
  • La tercera regla es acerca de si la página obtiene solo una cadena de consulta

Muchas gracias por su ayuda teknohippy y JasonMArcher

En mi proyecto, mi /PropertDetail.aspx puede obtener 2 cadenas de búsqueda.

Primero uno para PropertyId /PropertDetail.aspx?PropertyId=5

para Language /PropertDetail.aspx?PropertyId=5&Language=2

EDITAR: y esta página puede obtener uno de ellos o puede obtener ambos, por lo que mi regla de reescritura debe manejar ambos

Por lo tanto, he establecido estas reglas para web.config

<rewriter> <rewrite url="^(/.+(/.gif|/.png|/.jpg|/.ico|/.pdf|/.css|/.js)(/?.+)?)$" to="$1" processing="stop" /> <rewrite url="^/(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2" processing="stop"/> <!--http://localhost:1562/Harika-Gayrimenkul-5.aspx--> <rewrite url="^/(.+)-(.+)-(.+).aspx$" to="/PropertyDetail.aspx?PropertyId=$2&#038;Language=$3" processing="stop"/> <!--http://localhost:1562/Great-Property-5-2.aspx--> </rewriter>

Todo está bien si no hay una cadena de consulta de idioma, pero cuando hay una consulta de idioma obtiene la tercera expresión como PropertyId en lugar de Language

¿Cómo puedo definir estas dos reglas para la misma página?

Gracias


Haga que el segundo parámetro (el valor del idioma) sea opcional en la coincidencia agregando un signo de interrogación:

Editar: esta es una versión corregida, hecha después de darme cuenta de que entendí un poco la pregunta.

<rewriter> <rewrite url="/.(?:gif|png|jpg|ico|pdf|css|js)(?:/?.*)?$" to="$0" processing="stop"/> <rewrite url="(/d+)(?:-?(/d+)?)/.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> </rewriter>

Esta es una versión limpia y optimizada de lo que el OP tiene funcionando. Producirá resultados en forma de

/PropertyDetail.aspx?PropertyId=12345&Language=1 (when language is present) /PropertyDetail.aspx?PropertyId=12345&Language= (when it isn''t)

Nota

  • el uso de $ 0 atrás-referencia para referirse a la cadena de entrada completa, sin la necesidad de realmente coincidir con toda la cadena de entrada
  • el uso de grupos no capturados (?: ...) para cosas que no necesitamos almacenar en un grupo de partidos porque no queremos recuperar su valor más tarde
  • el colapso de las reglas separadas para URL de argumento único y de argumento doble en una sola regla

Versión original de la respuesta:

<rewriter> <rewrite url="^/(.+?)-(.+?)-?(.+?)?/.aspx$" to="/PropertyDetail.aspx?PropertyId=$2&amp;#038;Language=$3" processing="stop"/> </rewriter>


Respuesta combinada:

<rewriter> <rewrite url="^(/.+(/.gif|/.png|/.jpg|/.ico|/.pdf|/.css|/.js)(/?.+)?)$" to="$1" processing="stop"/> <rewrite url="^.+?([/d]+?)-([/d]+?)/.aspx$" to="/PropertyDetail.aspx?PropertyId=$1&amp;Language=$2" processing="stop"/> <rewrite url="^.+?-([/d]+?)/.aspx$" to="/PropertyDetail.aspx?PropertyId=$1" processing="stop"/> </rewriter>

Eso está funcionando bien ahora para muchas combinaciones:

/This-is-a-really-long-property-title-555-12

devuelve PropertyId = 555 y Language = 12.

/This-is-another-really-long-property-title-666

devuelve PropertyId = 666.