Какой самый безопасный способ определить, совпадают ли 2 URL? - PullRequest
5 голосов
/ 26 июня 2010

Если у меня есть URL-адрес A, скажем http://www.example.com/, а другой - http://www.example.com. Какой самый безопасный способ определить, одинаковы ли они оба, без запроса веб-страницы и выполнения различий?

Примеры:

  1. http://www.example.com/ VS http://www.example.com (упомянуто выше)
  2. http://www.example.com/aa/../ VS http://www.example.com

EDIT: Пояснения: просто хочу узнать, являются ли URL-адреса одинаковыми в контексте эквивалентности по стандарту RFC 1738.

Ответы [ 4 ]

13 голосов
/ 26 июня 2010

В .Net вы можете использовать класс System.Uri .

let u1 = new Uri ("http://www.google.com/");;

val u1:Uri = http://www.google.com/

let u2 = новый Uri ("http://www.google.com");;

val u2: Uri = http://www.google.com/

u1.Equals (u2) ;;

val it: bool = true

Для более детального сравнения можно использовать метод Uri.Compare . Существуют также статические методы для работы сразличные формы экранирования и кодирования символов в строке Uri, которые, без сомнения, окажутся полезными при тщательном рассмотрении предмета.

1 голос
/ 26 июня 2010

Для тех из вас, кто не знает F #, вот быстрое и грязное, но полное консольное приложение C #, которое демонстрирует использование класса Uri, чтобы определить, совпадают ли два URL-адреса. Когда вы запустите этот код, вы должны увидеть две строки: «true», а затем «false»:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(IsSameUrl("http://stackoverflow.com/", "http://stackoverflow.com").ToString());
            Console.WriteLine(IsSameUrl("http://stackoverflow.com/", "http://codinghorror.com").ToString());
            Console.ReadKey();
        }

        static bool IsSameUrl(string url1, string url2)
        {
            Uri u1 = new Uri(url1);
            Uri u2 = new Uri(url2);
            return u1.Equals(u2);
        }
    }
}
1 голос
/ 26 июня 2010

Очень мало вы можете сделать без запроса URL. Но вы можете определить несколько эвристик:

  1. Удалить косую черту
  2. Рассмотрим .htm и .html то же самое
  3. Предположим, /base/ и /base/index.html одинаковы
  4. Удалить параметры строки запроса (может быть, а может и нет, зависит от ваших потребностей)
  5. Рассмотрим url.com и www.url.com одно и то же.

Все очень сильно зависит от того, что именно вы подразумеваете под "одинаковыми" URL.

0 голосов
/ 26 июня 2010

Есть несколько вещей, которые можно добавить к ответам Ювала А:

  • www.google.com и http://www.google.com могут указывать на одну и ту же цель
  • www.google.com и google.com указывают на одну и ту же страницу (но она реализуется путем перенаправления)
  • URL может быть закодирован (см. Методы HttpUtility.UrlEncode / Decode)
...