2010-10-23 14 views
47

Tengo una url relativa o absoluta en una cadena. Primero necesito saber si es absoluto o relativo. ¿Cómo hago esto? Luego quiero determinar si el dominio de la url está en una lista de permitidos.Determine si Absolute or Relative URL

Aquí está mi lista de admitidos, como ejemplo:

string[] Allowed = 
{ 
    "google.com", 
    "yahoo.com", 
    "espn.com" 
} 

Una vez que sepa si su relativa o absoluta, su bastante simple que pienso:

if (Url.IsAbsolute) 
{ 
    if (!Url.Contains("://")) 
     Url = "http://" + Url; 

    return Allowed.Contains(new Uri(Url).Host); 
} 
else //Is Relative 
{ 
    return true; 
} 
+3

No olvide que algunas personas usan un subdominio 'www'. – icktoofay

+0

duplicado de http://stackoverflow.com/questions/2201171/determine-if-a-url-is-absolute-or-relative-from-vb –

Respuesta

84
bool IsAbsoluteUrl(string url) 
{ 
    Uri result; 
    return Uri.TryCreate(url, UriKind.Absolute, out result); 
} 
+4

Puede utilizar el método 'Uri.TryCreate' en su lugar para un código más bonito. –

+0

Obras. ¿Uri.TryCreate comprueba si la url se resuelve? – Mark

+0

@Mark, no, no es así. –

3

Puede lograr lo Desea más directamente con UriBuilder que puede manejar tanto los URI relativos como los absolutos (vea el ejemplo a continuación).

@icktoofay hace un buen punto también: asegúrese de incluir subdominios (como www.google.com) en su lista permitida o hacer más procesamiento en la propiedad builder.Host para obtener el dominio real. Si decide hacer más procesamiento, no olvide las URL con TLD complejos como bbc.co.uk.

using System; 
using System.Linq; 
using System.Diagnostics; 

namespace UriTest 
{ 
    class Program 
    { 
     static bool IsAllowed(string uri, string[] allowedHosts) 
     { 
      UriBuilder builder = new UriBuilder(uri); 
      return allowedHosts.Contains(builder.Host, StringComparer.OrdinalIgnoreCase); 
     } 

     static void Main(string[] args) 
     { 
      string[] allowedHosts = 
      { 
       "google.com", 
       "yahoo.com", 
       "espn.com" 
      }; 

      // All true 
      Debug.Assert(
       IsAllowed("google.com", allowedHosts) && 
       IsAllowed("google.com/bar", allowedHosts) && 
       IsAllowed("http://google.com/", allowedHosts) && 
       IsAllowed("http://google.com/foo/bar", allowedHosts) && 
       IsAllowed("http://google.com/foo/page.html?bar=baz", allowedHosts) 
      ); 

      // All false 
      Debug.Assert(
       !IsAllowed("foo.com", allowedHosts) && 
       !IsAllowed("foo.com/bar", allowedHosts) && 
       !IsAllowed("http://foo.com/", allowedHosts) && 
       !IsAllowed("http://foo.com/foo/bar", allowedHosts) && 
       !IsAllowed("http://foo.com/foo/page.html?bar=baz", allowedHosts) 
      ); 
     } 
    } 
} 
+0

¿Funciona esto con las URL relativas? Algo así como './Page/test.aspx' Edit: acaba de probar y no pudo manejar una url relativa. ¿Uribuilder tiene métodos para manejar cosas relativas? – Mark

+0

@Mark: no, no hay forma de que 'UriBuilder' sepa qué host desea en ese caso. Lanza una excepción. No obstante, no creo que ningún enfoque pueda manejar ese caso, ya que es una URL relativa a nada (o al menos no se especifica). –

+0

@Mark: ignora mi último comentario, veo que solo quieres 'devolver verdadero;' para el caso relativo, por lo que puedes usar 'Uri.TryCreate' como @Ian sugiere. –

16

Por alguna razón un par de buenas respuestas fueron eliminadas por sus propietarios:

Via @Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute) 

y

Uri.IsWellFormedUriString(url, UriKind.Relative) 

El UriParser e implementaciones a través de @Marcelo Cantos