HTML ссылка, связывающая содержимое «href» с существующим URL-адресом

#php #url-routing #pathinfo

Вопрос:

До сих пор я использовал параметры GET для маршрутизации между страницами моего веб-сайта (размещенного на сервере моего университета). Я бы хотел использовать $_SERVER["PATH_INFO"] вместо этого, так как это, я думаю, более чистый способ маршрутизации между страницами.

Я бы хотел уйти от:

 www.universitydomain.subdomain/myProject/index.php?action=imageGallery
 

Для:

 www.universitydomain.subdomain/myProject/index.php/imageGallery
 

У меня есть 3 страницы:

  1. Моя главная страница, index.php
  2. Моя страница галереи изображений, доступная в данный момент, когда параметр GET action равен «Галерея изображений».
  3. Страница для добавления изображения в мою галерею, доступная, если параметр GET action равен «addImage».

На каждой из этих страниц есть меню, состоящее <a> из ссылок:

 <a href="index.php" > Main page </a>
<a href="?action=imageGallery" > Gallery </a>
<a href="?action=addImage" > Add image </a>
 

Когда вы делаете это таким образом, все работает нормально. Поэтому я попытался использовать PATH_INFO URL-адрес стиля примерно так:

 <a href="index.php" > Main page </a>
<a href="index.php/imageGallery" > Gallery </a>
<a href="index.php/addImage" > Add image </a>
 

Если я нахожусь на странице галереи, я ожидаю <a>Main pagey</a> , что ссылка будет указана index.php в моем URL-адресе, что вернет меня на главную страницу. Тем не менее, это происходит :

  • Я в index.php деле . URL-адрес является www.universitydomain.subdomain/myProject/index.php
  • Я нажимаю на вторую ссылку, чтобы попасть в галерею. URL-адрес становится www.universitydomain.subdomain/myProject/index.php/imageGallery
  • Я нажимаю на первую ссылку, чтобы вернуться на главную страницу. URL-адрес становится www.universitydomain.subdomain/myProject/index.php/index.php
  • На третьем шаге, если вместо того, чтобы вернуться на главную страницу, я нажму на третью ссылку, чтобы перейти на addImage страницу, URL-адрес станет www.universitydomain.subdomain/myProject/index.php/index.php/addImage

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

У меня сложилось впечатление, что после перехода на страницу галереи (у которой есть URL /myProject/index.php/imageGallery -адрес) «ссылочный путь» моей страницы изменился на /myProject/index.php/ «от /myProject/ «, и, таким образом, при нажатии на <a href="index.php"> ссылку она перенаправляет меня на /myProject/index.php/index.php вместо /myProject/index.php/

Комментарии:

1. «Почему это?» -это разрешение относительного URL-адреса в атрибуте href для базового URL-адреса гипертекстового документа, частью которого он является. Это разрешение стандартизировано, как и способ получения URL-адреса базы документов. Ссылка на index.php на странице галереи должно быть "../index.php" не "index.php" так, как в противном случае браузер ведет себя подобным образом. Сравните: greenbytes.de/tech/webdav/rfc3986.html#reference-resolution для всех вариантов.

2. Спасибо за ссылку, очень полезная.

Ответ №1:

Когда вы переносите (изменяете) макет URL-адреса с одной index.php конечной точкой (иногда также называемой фронтальным контроллером) из части запроса ( ?action=<page-name> ) в часть пути (в PHP часто с $_SERVER['PATH_INFO'] ) и вводите дополнительные компоненты пути, вы можете увидеть это поведение. Это стандартно из правил разрешения URL-адресов.

 query-info               ->  path                      effect

index.php -or- ?, ., ""  ->  index.php                 0 new path components
?action=imageGallery     ->  index.php/imageGallery      1 new path component
?action=addImage         ->  index.php/addImage          1 new path component
 

В вашем конкретном случае, чтобы упростить миграцию, вы можете рассмотреть возможность быстрого обхода: если указано «нет PATH_INFO «, перенаправьте на главную страницу, содержащую то же количество компонентов пути, что и на двух других страницах.

 if (empty($_SERVER['PATH_INFO'])) {
   header('location: index.php/mainPage');
   echo '<!DOCTYPE html><title>moved</title><h1>moved</h1><a href="index.php/mainPage">here</a>.';
   return;
}
 
 <a href="mainPage" > Main page </a>
<a href="imageGallery" > Gallery </a>
<a href="addImage" > Add image </a>
 

Или аналогичное, замените index.php/mainPage на index.php/ то, что может иметь лучшую семантику для вашего случая:

 <a href="./" > Main page </a>
<a href="./imageGallery" > Gallery </a>
<a href="./addImage" > Add image </a>
 

Для последних двух ./ префикс, строго говоря, не нужен, это эквивалентно:

 <a href="./" > Main page </a>
<a href="imageGallery" > Gallery </a>
<a href="addImage" > Add image </a>
 

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

Для базового понимания я настоятельно рекомендую изучить спецификацию разрешения URL-адресов, поскольку это нечто очень фундаментальное и поможет вам самостоятельно принимать решения об изменениях макета URL-адресов и о том, как вы хотели бы использовать ее в своих HTML-документах, а также в своих серверных сценариях и общих приложениях.