web-dev-qa-db-ja.com

絶対URLまたは相対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;
}
56
Mark
bool IsAbsoluteUrl(string url)
{
    Uri result;
    return Uri.TryCreate(url, UriKind.Absolute, out result);
}
99

何らかの理由で、いくつかの適切な回答が所有者によって削除されました。

経由 @ Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

そして

Uri.IsWellFormedUriString(url, UriKind.Relative)

riParser および @ Marcelo Cantos による実装

25
Chris Marisic

相対URIと絶対URIの両方を処理できる UriBuilder を使用すると、より直接目的を達成できます(以下の例を参照)。

@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)
            );
        }
    }
}
3
Chris Schmich