#php #url-routing #pathinfo
Вопрос:
До сих пор я использовал параметры GET для маршрутизации между страницами моего веб-сайта (размещенного на сервере моего университета). Я бы хотел использовать $_SERVER["PATH_INFO"]
вместо этого, так как это, я думаю, более чистый способ маршрутизации между страницами.
Я бы хотел уйти от:
www.universitydomain.subdomain/myProject/index.php?action=imageGallery
Для:
www.universitydomain.subdomain/myProject/index.php/imageGallery
У меня есть 3 страницы:
- Моя главная страница, index.php
- Моя страница галереи изображений, доступная в данный момент, когда параметр GET
action
равен «Галерея изображений». - Страница для добавления изображения в мою галерею, доступная, если параметр 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-документах, а также в своих серверных сценариях и общих приложениях.