Подтвердить что ты не робот

Определите, является ли Абсолютный или Относительный 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;
}
4b9b3361

Ответ 1

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

Ответ 2

По некоторым причинам несколько хороших ответов были удалены их владельцами:

Через @Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

и

Uri.IsWellFormedUriString(url, UriKind.Relative)

UriParser и реализации через @Marcelo Cantos

Ответ 3

Вы можете добиться того, что хотите более непосредственно с UriBuilder, который может обрабатывать как относительные, так и абсолютные URI (см. пример ниже).

@icktoofay также делает хороший вывод: обязательно укажите субдомены (например, www.google.com) в разрешенном списке или сделайте больше обработки в свойстве builder.Host, чтобы получить фактический домен. Если вы решите сделать больше обработки, не забывайте о URL-адресах со сложными 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)
            );
        }
    }
}