Определите, если Абсолютный или Относительный URL - PullRequest
54 голосов
/ 23 октября 2010

У меня есть относительный или абсолютный 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;
}

Ответы [ 3 ]

97 голосов
/ 23 октября 2010
bool IsAbsoluteUrl(string url)
{
    Uri result;
    return Uri.TryCreate(url, UriKind.Absolute, out result);
}
25 голосов
/ 08 апреля 2016

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

Через @ Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

и

Uri.IsWellFormedUriString(url, UriKind.Relative)

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

3 голосов
/ 23 октября 2010

Вы можете достичь того, что хотите, более непосредственно, с помощью 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)
            );
        }
    }
}
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...