Как лучше всего нормализовать URL - PullRequest
1 голос
/ 20 января 2010

Я создаю сайт, который позволяет пользователям добавлять ключевые слова -> ссылки URL.Я хочу, чтобы несколько пользователей могли ссылаться на один и тот же URL-адрес (точно такой же, тот же экземпляр объекта).

Так что, если пользователь 1 вводит "http://www.facebook.com/index.php", а пользователь 2 вводит" http://facebook.com" и пользователь 3 вводит в "www.facebook.com", как мне лучше всего "преобразовать" их в то, во что все они решают: "http://www.facebook.com/"

Серверная часть находится в Python ...

Как поисковая система отслеживает URL-адреса? Они сохраняют URL-адрес, затем берут все, что он разрешает, или отбрасывают URL-адреса, которые отличаются от того, к чему они обращаются, и просто заботятся о разрешенной версии?

Спасибо !!!

Ответы [ 3 ]

3 голосов
/ 20 января 2010

Таким образом, если пользователь 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; более традиционные традиционно не делали и с радостью предоставили бы несколько ссылок на одну и ту же страницу, но я бы предположил, что другие крупные компании сейчас делают нечто подобное.)

0 голосов
/ 20 января 2010

Я бы сохранил 3 ссылки как разделенные, так как вы никогда не сможете с уверенностью сказать, что они разрешаются на одной странице. все зависит от того, как сервер (вне нашего контроля) разрешает URL.

0 голосов
/ 20 января 2010

Нет никакого способа узнать, кроме "волшебного" знания о конкретном веб-сайте, что "/index.php" - это то же самое, что и выборка "/".

Итак, ваша проблема, как указано,невозможно.

...