2009-07-27 27 views
46

Me gustaría tomar la URL original, truncar los parámetros de cadena de consulta y devolver una versión limpiada de la URL. Me gustaría que ocurriera en toda la aplicación, por lo que funcionar a través de global.asax sería ideal. Además, creo que una redirección 301 estaría en orden también.Truncar cadena de consulta y devolver URL limpia C# ASP.net

es decir.

en: www.website.com/default.aspx?utm_source=twitter & utm_medium =-media sociales

a cabo: www.website.com/default.aspx~~V~~3rd

¿Cuál sería la mejor manera ¿lograr esto?

Respuesta

100

System.Uri es tu amigo aquí. Esto tiene muchas utilidades votos en él, pero el que usted quiere es GetLeftPart:

string url = "http://www.website.com/default.aspx?utm_source=twitter&utm_medium=social-media"; 
Uri uri = new Uri(url); 
Console.WriteLine(uri.GetLeftPart(UriPartial.Path)); 

Esto le da a la salida: http://www.website.com/default.aspx

[La clase URI no requieren el protocolo http: //, a especificar ]

GetLeftPart dice básicamente "obtener la parte izquierda de la uri hasta la parte que especifico". Esto puede ser Scheme (solo http: // bit), Authority (la parte de www.website.com), Path (la /default.aspx) o Query (la cadena de consulta).

Suponiendo que se encuentra en una página web de aspx, puede usar Response.Redirect (newUrl) para redirigir a la persona que llama.

Espero que ayude

+0

¡Perfecto! Gracias Señor. – Chris

+0

Esto es lo que finalmente se nos ocurrió: // begin poor formatting string rawUrl = String.Concat (this.GetApplicationUrl(), Request.RawUrl); if (rawUrl.Contains ("/ post /")) { bool hasQueryStrings = Request.QueryString.Keys.Count> 1; if (hasQueryStrings) { Uri uri = new Uri (rawUrl); rawUrl = uri.GetLeftPart (UriPartial.Path); HtmlLink canonical = new HtmlLink(); canonical.Href = rawUrl; canonical.Attributes ["rel"] = "canónico"; Page.Header.Controls.Add (canónico); } } Seguido de una función para recuperar correctamente la URL de la aplicación. Funciona a la perfección. – Chris

+0

eek, no estoy seguro de cómo solucionar eso :(lol – Chris

0

Echa un vistazo a la clase UriBuilder. Puede crear uno con una cadena de url, y el objeto luego analizará esta url y le permitirá acceder solo a los elementos que desee.

0

supongo que desea hacer esto porque desea que los usuarios puedan ver las URL bonita que mira. La única forma de lograr que el cliente "modifique" la URL en su barra de direcciones es enviarla a una nueva ubicación, es decir, debe redirigirla.

¿Los parámetros de la cadena de consulta van a afectar el resultado de su página? Si es así, tendrá que ver cómo mantener el estado entre las solicitudes (variables de sesión, cookies, etc.) porque los parámetros de cadena de consulta se perderán tan pronto como lo redirija a una página sin ellos.

Hay algunas maneras que usted puede hacer esto a nivel mundial (en orden de preferencia):

  • Si usted tiene un control directo sobre el entorno de servidor a continuación, un módulo de servidor configurable como ISAPI_ReWrite o IIS 7.0 URL Rewrite Module es un gran acercamiento.
  • Un IHttpModule personalizado es un enfoque roll-your-own agradable y reutilizable.
  • También puede hacer esto en el global.asax como sugieres

Sólo debe utilizar el código 301 respuesta si el recurso de hecho se ha movido de forma permanente. Nuevamente, esto depende de si su aplicación necesita usar los parámetros de cadena de consulta. Si usa un redireccionamiento permanente, un navegador (que respeta el código de respuesta 301) omitirá la carga de una URL como .../default.aspx?utm_source = twitter & utm_medium = social-media y carga .../default.aspx - nunca conocerás los parámetros de la cadena de consulta.

Finalmente, puede usar las solicitudes de método POST. Esto le proporciona URL limpias y le permite pasar parámetros, pero solo funcionará con los elementos <form> o le solicita que cree usando JavaScript.

+0

Si desea que los usuarios vean URL con apariencia bonita, ¿por qué? no solo utilizar la asignación de URL? –

+0

La asignación de URL podría funcionar, pero debe definir una asignación para cada página en su archivo web.config. No puede definir reglas generales. Sin embargo, si no hay muchas páginas en el sitio, la configuración de estos una vez podría funcionar bien. Por otro lado, la reescritura de URL le brinda más control. – dariom

+0

Lo está haciendo para agregar enlaces canónicos y consolidar el rango de la página, no para la reescritura de URL: http: //googlewebmastercentral.blogspot.com/2009/02 /specify-your-canonical.html –

1

Esto puede parecer un poco mejor.

string rawUrl = String.Concat(this.GetApplicationUrl(), Request.RawUrl); 

    if (rawUrl.Contains("/post/")) 
    { 
     bool hasQueryStrings = Request.QueryString.Keys.Count > 1; 

     if (hasQueryStrings) 
     { 
      Uri uri = new Uri(rawUrl); 
      rawUrl = uri.GetLeftPart(UriPartial.Path); 

      HtmlLink canonical = new HtmlLink(); 
      canonical.Href = rawUrl; 
      canonical.Attributes["rel"] = "canonical"; 
      Page.Header.Controls.Add(canonical); 
     } 
    } 

Seguido por una función para recuperar correctamente la URL de la aplicación.

Funciona perfectamente.

+3

no debería ser esto bool hasQueryStrings = Request.QueryString.Keys.Count> 0; – George

-3

Después de completar el procesamiento de lo que tiene que hacer en la cadena de consulta, simplemente dividir la URL en el signo de interrogación:

Dim _CleanUrl as String = Request.Url.AbsoluteUri.Split("?")(0) 
Response.Redirect(_CleanUrl) 

Por supuesto, mi solución es en VB.NET, pero me imagino que podría ser portado con bastante facilidad. Y dado que solo estamos buscando el primer elemento de la división, incluso "falla" con gracia cuando no hay una cadena de consulta.

6

Aquí es un simple truco

Dim uri = New Uri(Request.Url.AbsoluteUri) 

dim reqURL = uri.GetLeftPart(UriPartial.Path) 
1

Aquí está una manera rápida de conseguir los sans de ruta de raíz la ruta completa y la consulta.

string path = Request.Url.AbsoluteUri.Replace(Request.Url.PathAndQuery,""); 
+0

Esto también eliminará la ruta, no solo la cadena de consulta – tocqueville

Cuestiones relacionadas