2010-10-23 21 views
47

Ich habe eine relative oder absolute URL in einer Zeichenfolge. Ich muss zuerst wissen, ob es absolut oder relativ ist. Wie mache ich das? Ich möchte dann feststellen, ob die Domäne der URL in einer Liste erlaubt ist.Ermitteln, ob absolute oder relative URL

Hier ist meine Zulassungsliste, als Beispiel:

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

Sobald ich weiß, ob seine relative oder absolute, seine ziemlich einfach denke ich:

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

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

Vergessen Sie nicht, dass einige Personen eine Subdomain "www" verwenden. – icktoofay

+0

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

Antwort

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

Sie können stattdessen die 'Uri.TryCreate'-Methode für schöneren Code verwenden. –

+0

Werke. Prüft Uri.TryCreate, ob die URL aufgelöst wird? – Mark

+0

@Mark, nein, tut es nicht. –

3

Sie erreichen können, was Sie wollen direkter mit UriBuilder, die sowohl relative als auch absolute URIs behandeln können (siehe Beispiel unten).

@icktoofay macht auch einen guten Punkt: sicher sein, entweder Subdomains (wie www.google.com) in Ihrer Liste enthalten oder mehr Verarbeitung auf der builder.Host-Eigenschaft, um die tatsächliche Domäne zu erhalten. Wenn Sie sich entscheiden, mehr zu verarbeiten, vergessen Sie nicht URLs mit komplexen TLDs wie 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

Funktioniert das mit relativen URLs? So etwas wie './Page/test.aspx' Edit: gerade getestet und es konnte keine relative URL behandelt werden. Verfügt URIBUILDER über Methoden, mit relativen Sachen umzugehen? – Mark

+0

@Mark: Nein, es gibt keine Möglichkeit für 'UriBuilder' zu wissen, welcher Host in diesem Fall gewünscht wird. Es löst eine Ausnahme aus. Ich denke jedoch, dass kein Ansatz mit diesem Fall umgehen kann, da das eine URL ist, die relativ zu nichts ist (oder zumindest nicht spezifiziert ist). –

+0

@Mark: ignoriere meinen letzten Kommentar, ich sehe, dass du nur 'true;' zurückgeben willst, für den relativen Fall kannst du 'Uri.TryCreate' verwenden, wie @Ian es vorschlägt. –

16

Aus irgendeinem Grund ein paar gute Antworten von ihren Besitzern gelöscht wurden:

Via @Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute) 

und

Uri.IsWellFormedUriString(url, UriKind.Relative) 

Die UriParser und Implementierungen über @Marcelo Cantos

Verwandte Themen