Как лучше всего нормализовать URL
Я создаю сайт, который позволяет пользователям добавлять ключевые слова -> ссылки URL. Я хочу, чтобы несколько пользователей могли ссылаться на один и тот же URL-адрес (в точности один и тот же экземпляр объекта).
Поэтому, если пользователь 1 вводит " http://www.facebook.com/index.php ", а пользователь 2 вводит " http://facebook.com/ ", а пользователь 3 вводит "www.facebook.com", как мне это сделать? Лучше всего "преобразовать" их в то, к чему все они решают:
Бэкэнд в Python...
Как поисковая система отслеживает URL-адреса? Сохраняют ли они URL-адрес, затем принимают то, что он разрешает, или отбрасывают URL-адреса, которые отличаются от того, к чему они относятся, и просто заботятся о разрешенной версии?
Спасибо!!!
3 ответа
Поэтому, если пользователь 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 как правильный. (View Source: Stack Overflow делает это.)
Однако, к сожалению, дело пользователя 1 не может быть разрешено. Facebook обслуживает страницу в /
и страницу в /index.php
и хотя мы можем посмотреть на них и сказать, что они одинаковы, не существует технического метода для описания этих отношений. В идеальном мире Facebook будет включать в себя либо 301
перенаправить ответ или <link rel="canonical" />
сказать людям, что /
был правильный формат URL для доступа к конкретному ресурсу, а не /index.php
(или наоборот). Но они этого не делают, и на самом деле большинство веб-сайтов, управляемых базой данных, этого еще не делают.
Чтобы обойти это, некоторые поисковые системы (*) сравнивают контент в разных [под] доменах, и в ограниченной степени также разные пути на одном хосте, и предполагают, что они одинаковы, если контент достаточно похож. Конечно, это много работы, требует много памяти и обработки, и в конечном итоге не очень надежно.
Я бы не стал сильно беспокоиться об этом, кроме исправления URL-адресов, как в случае с пользователем 3. Из вашего описания не кажется существенным, что страницы, которые "одинаковы", должны иметь общую идентичность, если нет конкретного варианта использования, который вы не упомянули.
(*: ну, в любом случае, Google; более традиционные традиционно не делали и с радостью предоставили бы несколько ссылок на одну и ту же страницу, но я бы предположил, что другие крупные компании сейчас делают нечто подобное.)
Я бы сохранил 3 ссылки как разделенные, так как вы никогда не сможете с уверенностью сказать, что они разрешают одну и ту же страницу. все зависит от того, как сервер (вне нашего контроля) разрешает URL.
Нет никакого другого способа узнать, кроме "магического" знания о конкретном веб-сайте, что "/index.php" - это то же самое, что и "/".
Итак, ваша проблема, как заявлено, невозможна.