确定绝对或相对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) ); } } }