我在字符串中有一个相对或绝对的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;
}
答案 0 :(得分:95)
bool IsAbsoluteUrl(string url)
{
Uri result;
return Uri.TryCreate(url, UriKind.Absolute, out result);
}
答案 1 :(得分:24)
出于某种原因,他们的主人删除了几个好的答案:
Uri.IsWellFormedUriString(url, UriKind.Absolute)
和
Uri.IsWellFormedUriString(url, UriKind.Relative)
答案 2 :(得分:3)
您可以使用UriBuilder
更直接地实现您想要的,它可以处理相对URI和绝对URI(参见下面的示例)。
@icktoofay也很重要:确保在您允许的列表中包含子域(如www.google.com
)或在builder.Host
属性上执行更多处理以获取实际域。如果您决定进行更多处理,请不要忘记具有复杂TLD的网址,例如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)
);
}
}
}