Нормализация части URI заданного базового URL с помощью PHP - PullRequest
0 голосов
/ 20 июня 2010

Во-первых, я делаю это для веб-сканера (он же паук, он же червь ...)

Учитывая две строки (базовый URL и относительный URL), мне нужно определить абсолютный URL.Это особенно сбивает с толку, когда дело доходит до «SEO-дружественного» дерьма, такого как:

Базовый URL: http://aaa.com/january/15/test Найденный URL: /test.php?aaa

Как бы язнаете, что выше не папки или нет?Например;абсолютный путь будет:

http://aaa.com/january/15/test/test.php?aaa

Или:

http://aaa.com/january/15/test.php?aaa

?

Путаница связана с тем, существует ли индекс в действии или нет."/test/index.php" или "/index.php"?

1 Ответ

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

Вы не можете решить эту проблему, изучив только URL.

Вы говорите, что вам нужен абсолютный URL с учетом базового URL и относительного URL. Полный URL - это объединение базового и относительного URL. Как вы уже видели, знание этого никуда не поможет.

http://example.com/directory/index.php и http://example.com/directory/ может законно ссылаться на два разных ресурса.

http://example.com/directory/index.php и http://example.com/directory/foo/bar/baz.php могут законно ссылаться на один и тот же конечный ресурс.

Во втором приведенном выше примере, что является каноническим URL? Это не то, что может быть обязательно определено в вычислительном отношении. Канонический URL - это тот, который вы выбираете в качестве канонического URL.

Здесь вы на самом деле сталкиваетесь с двумя проблемами:

  1. Когда два разных URL ссылаются на один и тот же ресурс?
  2. Какой URL является каноническим URL?

1. Когда два разных URL ссылаются на один и тот же ресурс?

Это нельзя определить путем сравнения URL-адресов. Это можно определить только путем сравнения самого ресурса, то есть содержимого и заголовков HTTP.

ETag - http://en.wikipedia.org/wiki/HTTP_ETag

Короче говоря, ETag - это HTTP-заголовок, уникальный для ресурса. Он предназначен для проверки кэша, т. Е. Содержимое моего кэша совпадает с содержимым http://example.com/content?

Два идентичных ресурса, по крайней мере от одного хоста, будут иметь одинаковое значение заголовка ETag. Используйте это, если возможно (не все веб-серверы будут возвращать заголовок ETag).

HTTP заголовок и сравнение содержимого

Когда два ресурса идентичны? Когда тип содержимого и содержимое совпадают.

Сравните тип содержимого с помощью заголовка Content-Type. Сравнение самого контента - простой случай сравнения строк.

Если вы храните свойства ранее найденных ресурсов и сравниваете их с недавно найденными ресурсами, вам не нужно рассматривать полный текст ресурса для целей сравнения - хеш подойдет.

Что касается PHP, расширение HTTP даст вам все, что вам нужно, с очень удобным OO API для проверки заголовков HTTP и полного содержимого ресурса. Функция md5 () является одним из вариантов создания уникального хэша. Есть и другие.

2. Какой URL является каноническим URL?

Выберите один и придерживайтесь его. По умолчанию один URL не более каноничен, чем другой для того же ресурса. Для простоты вы можете рассмотреть самый короткий из двух URL как каноническую форму.

...