确定绝对或相对URL

我有一个string中的相对或绝对url。 我首先需要知道它是绝对的还是相对的。 我该怎么做呢? 然后,我想要确定该url的域是否在允许列表中。

以下是我的允许列表,例如:

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

一旦我知道它的相对或绝对,我认为它相当简单:

 if (Url.IsAbsolute) { if (!Url.Contains("://")) Url = "http://" + Url; return Allowed.Contains(new Uri(Url).Host); } else //Is Relative { return true; } 
 bool IsAbsoluteUrl(string url) { Uri result; return Uri.TryCreate(url, UriKind.Absolute, out result); } 

出于某种原因,一些好的答案被他们的主人删除了:

通过@Chamika Sandamal

 Uri.IsWellFormedUriString(url, UriKind.Absolute) 

 Uri.IsWellFormedUriString(url, UriKind.Relative) 

UriParser和实现通过@Marcelo Cantos

你可以直接用UriBuilder实现你想要的UriBuilder ,它可以处理相对和绝对的URI(见下面的例子)。

@icktoofay也提供了一个很好的观点:请确保在允许的列表中包含子域(如www.google.com ),或者在builder.Host上执行更多的处理。主属性可以获取实际的域。 如果您决定进行更多处理,请不要忘记包含bbc.co.uk等复杂顶级域名(TLD)的url。

 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) ); } } }