web-dev-qa-db-fra.com

Déterminer si l'URL absolue ou relative

J'ai une URL relative ou absolue dans une chaîne. J'ai d'abord besoin de savoir si c'est absolu ou relatif. Comment puis-je faire cela? Je veux ensuite déterminer si le domaine de l'URL est dans une liste d'autorisation.

Voici ma liste d'autorisation, à titre d'exemple:

string[] Allowed =
{
   "google.com",
   "yahoo.com",
   "espn.com"
}

Une fois que je sais si c'est relatif ou absolu, c'est assez simple je pense:

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

Pour une raison quelconque, quelques bonnes réponses ont été supprimées par leurs propriétaires:

Via @ Chamika Sandamal

Uri.IsWellFormedUriString(url, UriKind.Absolute)

et

Uri.IsWellFormedUriString(url, UriKind.Relative)

--- riParser et implémentations via @ Marcelo Cantos

25
Chris Marisic

Vous pouvez obtenir ce que vous voulez plus directement avec UriBuilder qui peut gérer à la fois les URI relatifs et absolus (voir l'exemple ci-dessous).

@icktoofay fait également un bon point: assurez-vous d'inclure soit des sous-domaines (comme www.google.com) dans votre liste autorisée ou effectuez d'autres traitements sur le builder.Host propriété pour obtenir le domaine réel. Si vous décidez de faire plus de traitement, n'oubliez pas les URL avec des TLD complexes comme 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)
            );
        }
    }
}
3
Chris Schmich