簡體   English   中英

確定是否為絕對或相對URL

[英]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);
}

出於某種原因,他們的主人刪除了幾個好的答案:

通過@Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

Uri.IsWellFormedUriString(url, UriKind.Relative)

UriParser@Marcelo Cantos的實現

您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM