2010-10-23 8 views
47

J'ai une URL relative ou absolue dans une chaîne. Je dois d'abord savoir si c'est absolu ou relatif. Comment puis-je faire cela? Je veux ensuite déterminer si le domaine de l'URL est dans une liste d'autorisation.Détermine si l'URL absolu ou relatif

Voici ma liste verte, à titre d'exemple:

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

Une fois que je sais si son parent ou absolu, son je pense assez simple:

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

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

N'oubliez pas que certaines personnes utilisent un sous-domaine 'www'. – icktoofay

+0

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

Répondre

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

Vous pouvez utiliser la méthode 'Uri.TryCreate' à la place pour du code plus joli. –

+0

Fonctionne. Est-ce que Uri.TryCreate vérifie si l'URL résout? – Mark

+0

@Mark, non, ce n'est pas le cas. –

3

Vous pouvez réaliser ce que vous voulez plus directement avec UriBuilder qui peut gérer à la fois les URI relatifs et absolus (voir l'exemple ci-dessous). @icktoofay fait également un bon point: assurez-vous d'inclure des sous-domaines (comme www.google.com) dans votre liste autorisée ou effectuez un traitement supplémentaire sur la propriété builder.Host pour obtenir le domaine actuel. Si vous décidez de faire plus de traitement, n'oubliez pas les URL avec des TLD complexes comme 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

Est-ce que cela fonctionne avec des URLs relatives? Quelque chose comme './Page/test.aspx' Edit: juste testé et il a échoué à gérer une URL relative. Est-ce que uribuilder a des méthodes pour gérer les choses relatives? – Mark

+0

@Mark: non, UriBuilder ne peut pas savoir quel hôte vous voulez dans ce cas. Il jette une exception. Je ne pense pas que n'importe quelle approche puisse gérer ce cas, cependant, puisqu'il s'agit d'une URL relative à rien (ou du moins, elle n'est pas spécifiée). –

+0

@Mark: ignorez mon dernier commentaire, je vois que vous voulez juste 'return true;' pour le cas relatif, vous pouvez donc utiliser 'Uri.TryCreate' comme @Ian le suggère. –

16

Pour une raison quelconque quelques bonnes réponses ont été supprimés par leurs propriétaires:

Via @Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute) 

et

Uri.IsWellFormedUriString(url, UriKind.Relative) 

Le UriParser et mises en œuvre par @Marcelo Cantos

Questions connexes