Преобразование относительных ссылок в абсолют? - PullRequest
1 голос
/ 13 февраля 2009

Я программирую небольшой скрипт, используя PHP и регулярные выражения

Целью этого скрипта является извлечение всех ссылок на странице и преобразование этих ссылок в абсолютные, если они относительные. Я понял, как работают относительные ссылки, но их некоторые вопросы также

Допустим, у нас есть эта страница http://www.example.com/xxx1/xxx2/xxx3.html если на этой странице есть следующие ссылки

index.html --- абсолютная ссылка будет http://www.example.com/xxx1/xxx2/index.html

. / Index.html --- абсолютная ссылка будет http://www.example.com/xxx1/xxx2/index.html

.. / index.html --- абсолютная ссылка будет http://www.example.com/xxx1/index.html

/ index.html --- абсолютная ссылка будет http://www.example.com/index.html

так

index.html = откроется в текущем каталоге

. / Index.html = также откроется в текущем каталоге

.. / index.html = откроется в родительском каталоге

/ index.html = откроется в корневом каталоге

проблема в том, что, если URL является дружественным для поисковых систем?

скажем, у нас есть этот URL

((case1)): http://www.example.com/xxx1/xxx2/xxx3/index/

или

((case2)): http://www.example.com/xxx1/xxx2/xxx3/index

это "index" в case1 каталог или страница? Это каталог в case2 или страница? и как следующие ссылки будут выглядеть как абсолютные ссылки в обоих случаях 1 и 2

index.html ---?

. / Index.html ---?

.. / index.html ---?

/ index.html ---?

Я не уверен, что для некоторых из вас это простой вопрос, но для меня это сбивает с толку?

Спасибо:)

1 Ответ

3 голосов
/ 13 февраля 2009

Прямой ответ на ваш пример

В случае 1 , index является «компонентом каталога» URL, а в случае 2 index является «файловым компонентом» URL. Это не зависит от того, является ли это обычный файл или каталог на веб-сервере - см. Объяснение ниже. Я бы назвал обе страницы «страницей», если сервер обслуживает HTML-страницу по этим URL-адресам.

Дело 1: (ссылки с <a href="http://www.example.com/xxx1/xxx2/xxx3/index/" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index/</a>)

  1. index.html -> <a href="http://www.example.com/xxx1/xxx2/xxx3/index/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index/index.html</a>
  2. ./index.html -> <a href="http://www.example.com/xxx1/xxx2/xxx3/index/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index/index.html</a>
  3. ../index.html -> <a href="http://www.example.com/xxx1/xxx2/xxx3/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index.html</a>
  4. /index.html -> <a href="http://www.example.com/index.html" rel="nofollow noreferrer">http://www.example.com/index.html</a>

Случай 2: (ссылки с <a href="http://www.example.com/xxx1/xxx2/xxx3/index" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index</a>)

  1. index.html -> <a href="http://www.example.com/xxx1/xxx2/xxx3/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index.html</a>
  2. ./index.html -> <a href="http://www.example.com/xxx1/xxx2/xxx3/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index.html</a>
  3. ../index.html -> <a href="http://www.example.com/xxx1/xxx2/index.html" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/index.html</a>
  4. /index.html -> <a href="http://www.example.com/index.html" rel="nofollow noreferrer">http://www.example.com/index.html</a>

Таким образом, единственное, что остается неизменным, это абсолютные ссылки - 4.

Объяснение

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

URL-адреса, заканчивающиеся косой чертой, считаются ссылками на каталоги (подразумевается RFC2396 для синтаксиса URI, хотя на самом деле он их так не называет), иначе они считаются ссылками на файлы в каталогах.

- Примечание: Это не обязательно будет соответствовать типу пути файловой системы (если он есть), используемому веб-сервером для обслуживания файла. Большинство веб-серверов, при запросе запрашивается сопоставление URL-адреса с каталогом в их файловой системе, либо он будет обслуживать файл в каталоге с некоторым именем набора (часто index.html, но выбор обычно может быть настроен), либо список каталогов HTML, сгенерированный сервером ( или ошибка доступа, если это было отключено). То же самое обычно применяется при запросе «URL-адреса файла» для аналогичного пути без завершающего слеша, и в этом случае «URL-адрес файла» фактически сопоставляется с путем к файловой системе каталога. -

Это может привести к несоответствиям, таким как приведенный выше пример, где «URL-адрес файла» <a href="http://www.example.com/xxx1/xxx2/xxx3/index" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index</a>, вероятно, эквивалентен «URL-адресу каталога» <a href="http://www.example.com/xxx1/xxx2/xxx3/index/" rel="nofollow noreferrer">http://www.example.com/xxx1/xxx2/xxx3/index/</a>, но относительные ссылки могут ссылаться на разные пути из этих двух URL-адресов, и один может работать, а другой может сломаться.

По этой причине при ссылке на каталог рекомендуется всегда использовать «URL каталога» (с завершающей косой чертой), а не эквивалентный «URL файла» - например, ссылка на <a href="http://www.ietf.org/meetings/" rel="nofollow noreferrer">http://www.ietf.org/meetings/</a>, а не <a href="http://www.ietf.org/meetings" rel="nofollow noreferrer">http://www.ietf.org/meetings</a>, даже если обе они будут отображаться на одной странице. Многие веб-серверы фактически настроены на перенаправление клиентов, запрашивающих последние, на первый с помощью ответа перенаправления HTTP 301. Вы можете увидеть это, если введете последнее в адресную строку вашего браузера - после получения этого ответа строка URL изменится на прежнюю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...