2011-12-21 16 views
10

Hace unos años, creé un sitio ASP.NET basado en una base de datos, que utiliza una sola página APSX para mostrar todas las páginas del sitio. Así que todas las direcciones URL del sitio están en el siguiente formato:Más cadena de consulta de inicio de sesión para el sitio ASP.NET

/main.aspx?page=Page+Title+One 

/main.aspx?page=Another+Article+Title 

/main.aspx?page=Third+Page 

La página main.aspx obtiene los datos de cadena de consulta (Página + nombre + Uno, por ejemplo) y lo utiliza como una clave para sacar el artículo apropiado contenido de la base de datos del servidor SQL. El título real de la página se almacena en el archivo db con espacios en lugar de más (por ejemplo, "Título de página uno").

La mala decisión de ir con el signo + como separador de palabras en la cadena de consulta URL está causando muchos problemas con los motores de búsqueda últimamente (contenido duplicado, etc.), así que quiero solucionarlo, pero sin cambiar las URL .

Lo que quiero hacer es cuando el motor de búsqueda o visitante trata de visitar la URL equivocada faltan los signos + y tener espacios en blanco en su lugar, por ejemplo:

/main.aspx?page=Page Title One 

que quiero hacer 301 redirección permanente a:

/main.aspx?page=Page+Title+One 

para poder hacer esto tengo que comprobar si el valor de cadena de consulta tiene ventajas o espacios en blanco, sin embargo, cuando llegue el valor con Request.QueryString [ "página"], incluso si la cadena tiene quesry real más aún, sigo recibiendo cadenas con espacios en blanco "Título de la página uno".

El sitio funciona sobre IIS6/Win 2003.

¿Cómo puedo hacer esto?

Respuesta

2

Bueno, por supuesto no se puede poner un espacio en un URI en cualquier caso. Lo que puede hacer es poner %20 en el cual la forma de codificar un espacio en cualquier punto de un URI así como + es la manera normal de codificar un espacio en la porción de consulta, y la forma recomendada de hacerlo en esa parte de porque% 20 puede causar problemas.

Debido a esto es un detalle implementaiton urlencoded-x-www-formulario de solicitud/Normalmente se preocupan por los datos reales enviados, Request.QueryString[] hace el unescape para usted, convirtiendo tanto + y %20 en un espacio.

Quiere ver Request.RawUrl (devuelve una cadena) o Request.Url que devuelve Uri. Probablemente lo más fácil es alimentar Request.Url en un UriBuilder para que pueda cambiar la consulta y obtener un Uri.

Aún así, recomendaría el enfoque opuesto, si tiene problemas con el contenido duplicado debido a las dos formas posibles de codificar un espacio en la cadena de consulta, vaya con la norma recomendada y cambie los casos de %20 a + en lugar de al revés.

var u = Request.Url; 
if(u.Query.Contains("%20")) 
{ 
    var ub = new UriBuilder(u); 
    Console.WriteLine(ub.Query); 
    string query = ub.Query; 
    //note bug in Query property - it includes ? in get and expects it not to be there on set 
    ub.Query = ub.Query.Replace("%20", "+").Substring(1); 
    Response.StatusCode = 301; 
    Response.RedirectLocation = ub.Uri.AbsoluteUri; 
    Response.End(); 
} 
+0

Mis URL siempre han usado el signo más solo en lugar de espacios en blanco o el% 20, sin embargo, veo páginas en caché en Google con el siguiente aspecto 2: /main.aspx?page=KW1 KW2 y /main.aspx?page=KW1% 20KW2, que son incorrectos y causan problemas de contenido duplicado. Ahora quiero enviarlos a la URL correcta que es /main.aspx?page=KW1+KW2. –

+0

Eso es más o menos lo que estaba explicando. No estoy seguro de lo que no estaba claro, así que he agregado código-ejemplo que con suerte explica. –

+0

Gracias Jon, esto es exactamente lo que necesitaba :). ¿Cómo marco la pregunta como respondida? –

3

El signo + se interpreta como un espacio para URL.

Es decir, para codificar un espacio URL, puede usar %20 o +.

Ver this SO answer para "URL que codifica el carácter de espacio: ¿+ o% 20?"

4

Usando Request["key"], convierte automáticamente todos los signos "+" en espacios. Debe usar Request.RawUrl para ver si hay signos más. También puede usar System.Web.HttpUtility.ParseQueryString para analizar cualquier consulta de cadena. Puede probar si Request.QueryString.ToString().Contains("+") es verdadero y hacer lógica desde allí.

+0

Esto es exactamente mi problema. Deseo poder hacer una distinción entre las siguientes 2 solicitudes GET: /main.aspx?page=KW1+KW2 y /main.aspx?page=KW1 KW2. –

+0

Ver mi publicación original. Parece que 'Request.QueryString.ToString(). Contains (" + ")' te dará si es el primer o el segundo caso. –

+0

Sí, pero esto no resolverá una URL incorrecta en el siguiente formato /main.aspx?page=KW1 KW2 + KW3. –

0

Puede probar esto:

Request.QueryString["page"].Trim(); 
Cuestiones relacionadas