[英]Determine if Absolute or Relative URL
我在字符串中有一個相對或絕對的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);
}
出於某種原因,他們的主人刪除了幾個好的答案:
Uri.IsWellFormedUriString(url, UriKind.Absolute)
和
Uri.IsWellFormedUriString(url, UriKind.Relative)
您可以使用UriBuilder
直接實現您想要的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)
);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.