Таким образом, если пользователь 1 вводит "http://www.facebook.com/index.php"" и пользователь 2 вводит "http://facebook.com"", а пользователь 3 вводит "www.facebook.com", как мне лучше всего "преобразовать" их в что? все они решают: "http://www.facebook.com/"
Вы разрешите пользователя 3, исправив недействительные URL-адреса. www.facebook.com
не является URL, но вы можете догадаться, что http://
должен идти с самого начала. Пустая часть пути совпадает с путем /
, так что вы можете быть уверены, что он должен идти и в конце. Хороший парсер URL должен уметь это делать.
Вы можете разрешить пользователя 2, отправив запрос HTTP HEAD на URL. Если он возвращается с кодом состояния 301
, вы получаете постоянное перенаправление на реальный URL в заголовке ответа Location
. Facebook делает это, чтобы отправить facebook.com
трафик на www.facebook.com
, и это определенно то, что сайты должны делать (хотя многие в реальности этого не делают). Вы можете разрешить другим кодам статуса перенаправления в семействе 3xx
сделать то же самое; это не совсем правильно, но некоторые сайты используют 302
вместо 301
для перенаправления, потому что они немного толстые.
Если у вас есть время и сетевые ресурсы (плюс больше кода, чтобы предотвратить злоупотребление этой функцией для DoS вас или других), вы также можете рассмотреть возможность получения целевой веб-страницы и ее анализа (при условии, что это не HTML). Если на странице есть элемент <link rel="canonical" href="..." />
, вы должны также рассматривать этот URL как правильный. (Просмотр источника: переполнение стека делает это.)
Однако, к сожалению, дело пользователя 1 не может быть разрешено. Facebook обслуживает страницу в /
и страницу в /index.php
, и хотя мы можем посмотреть на них и сказать, что они одинаковы, нет никакого технического метода, чтобы описать эти отношения. В идеальном случае Facebook будет включать либо ответ 301
о перенаправлении, либо <link rel="canonical" />
, чтобы сообщить людям, что /
- это правильный формат URL для доступа к конкретному ресурсу, а не /index.php
(или наоборот). Но они этого не делают, и на самом деле большинство веб-сайтов, управляемых базой данных, этого еще не делают.
Чтобы обойти это, некоторые поисковые системы (*) сравнивают контент в разных [под] доменах, и в ограниченной степени также разные пути на одном и том же хосте, и предполагают, что они одинаковы, если контент достаточно аналогичный. Конечно, это много работы, требует много памяти и обработки, и в конечном итоге не очень надежно.
Я бы не стал сильно беспокоиться об этом, кроме исправления URL, как в случае с пользователем 3. Из вашего описания не кажется существенным, что страницы, которые «одинаковы», должны иметь общую идентичность, если только вы не упомянули конкретный вариант использования.
(*: ну, в любом случае, Google; более традиционные традиционно не делали и с радостью предоставили бы несколько ссылок на одну и ту же страницу, но я бы предположил, что другие крупные компании сейчас делают нечто подобное.)