Наличие ссылок относительно пути (например, http://domain/path/)

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

Начнем с самого начала. Я разрабатываю пользовательскую систему управления контентом на PHP. Я использую mod_rewrite для перенаправления всех запросов, таких как http://domain.com/path/artist/edit/25, на http://domain.com/path/index.php?url=/artist/edit/25. Таким образом, часть URL-адреса, следующая за http://domain.com/path/, на самом деле является виртуальной.

Я бы хотел, чтобы все ссылки были в формате <a href="artist/show">...</a>, а ссылки на изображения, скрипты и т.д. в формате <link href="ui/css/style.css"...>.

Ну, это кажется возможным с:

    ...
    <base href="http://domain.com/path/" />
    ...

Таким образом, я могу ссылаться на сценарии и таблицы стилей, как показано ниже:

    ...
    <!-- Custom page style CSS -->
    <link href="ui/css/style.css" rel="stylesheet" type='text/css'>
    <!-- Support for CSS3 media query in IE8 -->
    <script type="text/javascript" src="ui/js/respond.js"></script>
    <!-- MooTools 1.6.0 -->
    <script type="text/javascript" src="ui/js/MooTools-Core-1.6.0.js"></script>
    ...

Однако, насколько мне известно, <base href=...> должен соответствовать текущему запросу страницы (то есть http://domain.com/path/artist/edit/25). И это портит всю концепцию.

Вот почему мне нужно, чтобы вы уточнили:

  1. Является ли общепринятой практикой, когда <base href=...> указывает на каталог, а не на текущий URL-адрес документа?
  2. Соответствует ли эта практика требованиям к использованию HTML-элемента <base>?
  3. Повлияет ли это каким-либо образом на такие поисковые роботы, как Googlebot? Требуют ли они, чтобы <base href=...> соответствовал URL-адресу каждого конкретного документа?

Я также хотел бы знать, как вы решаете проблему относительных ссылок и ссылок на ресурсы, когда часть URL является виртуальной. Я обнаружил, что такие проекты, как WordPress, как правило, полностью избегают относительных ссылок и идут по «пути абсолютных ссылок».


person ezpresso    schedule 24.04.2016    source источник
comment
1. Да - это общепринятая практика. 2. Это не повлияет на кроулеров. 3. Как и этот вопрос - он в первую очередь основан на мнении.   -  person Alon Eitan    schedule 24.04.2016


Ответы (3)


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

Основные поисковые роботы поддерживают как абсолютные, так и относительные URL-адреса, а также элемент base. Некоторые поисковые роботы не понимают относительные URL-адреса и/или не поддерживают элемент base (что приводит к множеству строк 404 в журналах вашего сервера, хотя это незначительная проблема).

Я бы рекомендовал не использовать элемент base. Относительные ссылки, как правило, подвержены ошибкам, что приводит к неправильному разрешению URL-адресов, но не дает каких-либо серьезных преимуществ. Как правило, более разумно и просто всегда использовать абсолютные URL-адреса.

person Marat Tanalin    schedule 24.04.2016

Является ли общепринятой практикой указывать на каталог, а не на текущий URL-адрес документа?

Нет, это не обычно. На самом деле я бы сказал, что это очень редко, потому что есть лучшие способы создать логическую информационную архитектуру вашего сайта без него.

Повлияет ли это каким-либо образом на такие поисковые роботы, как Googlebot? Требуют ли они соответствия каждому конкретному URL-адресу документа?

Трудно получить правильный базовый тег, и есть способы сделать то, что вы хотите, используя лучшие методы, которые прозрачны для googlebot и т. д.

Обратите внимание, что абсолютные ссылки — это то, что вы видите в исходном коде, но это не означает, что ссылки физически сопоставляются с каталогами, файлами и т. д. Используя такие инструменты, как mod_rewrite на apache, вы можете структурировать свой сайт любым удобным для вас способом практически с любым физической файловой системы, это также то, что я бы рекомендовал, потому что по мере того, как все меняется, вы не привязаны к конкретному решению. Именно поэтому большинство php-приложений отправляют все через скрипт index.php, после чего приложение контролирует информационную архитектуру, а не файловую систему.

person Harry    schedule 28.04.2016

"base href" можно использовать без проблем, но это не всегда лучшее решение. Это нормально, если ваш сервер будет отвечать на запросы с другим именем сервера и путями (например, "http://www.example.com/companysection/especificservice" и "http://service.internalnetwork.dev/" )

ИМХО это не лучшее решение для вашего случая.

В URL-адресе "http://example.com/path/index.php?url=/artist/edit/25" вы хотите преобразовать часть запроса в путь ( base example.com/path/index.php ?url= ).. , и это может быть большой проблемой. Как вы собираетесь обрабатывать запросы, которые также содержат запрос? (например, получение поискового запроса или формы GET)

Apache mod_rewrite был бы лучшим вариантом, как предлагает ответ Гарри (или правила перезаписи nginx). С его помощью вы можете легко «преобразовать» запрос типа http://example.com/path/artist/edit/25?search=something&order=ASC в http://example.com/path/index.php?url=artist/edit/25&search=something&order=ASC Это избавит вас от проблем в долгосрочной перспективе.

Проверьте последний пример в https://wiki.apache.org/httpd/RewriteQueryString , это действительно близко, чтобы удовлетворить все ваши потребности в переписывании (вам просто нужно убедиться, что вы правильно обрабатываете остальную часть запроса)

Возьмите URL вида http://example.com/path/var/val и преобразуйте в запрос var=val http://example.com/path?var=val. По сути, обратная сторона вышеприведенного рецепта. Этот пример будет работать для любого допустимого трехуровневого URL. http://example.com/path/var/val будет преобразовано в http://example.com/path?var=val.

Правило перезаписи ^/путь/([^/]+)/([^/]+) /путь?$1=$2

person miguel-svq    schedule 01.05.2016