Маршрутизация URL-адресов в среде MVC — PHP

Я разрабатываю структуру MVC на PHP с нуля; в основном для обучения, но это может легко закончиться живым проектом. Я просмотрел это руководство в качестве основы и расширен оттуда.

Запросы делаются так:

examplesite.com/controller/action/param1/param2/ и так далее...

А это мой файл .htaccess:

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?rt=$1 [L,QSA]

Таким образом, все запросы идут в index.php, и они направляются к правильному контроллеру и действию оттуда. Если не указан ни контроллер, ни действие, то для обоих используется «индекс» по умолчанию.

У меня есть контроллер индекса с действием индекса, который должен быть домашней страницей моего сайта. Я могу получить к нему доступ, перейдя на examplesite.com (поскольку предполагается индексная часть). В нем есть несколько изображений, ссылка на таблицу стилей и несколько скриптов. Они связаны путями относительно index.php. Я подумал, что это будет нормально, так как все запросы идут на index.php, и весь контент просто включается на эту страницу с помощью php. Это работает, если я захожу на examplesite.com. Я увижу все изображения и стили, и запустятся сценарии. Однако, если я перехожу на examplesite.com/index, меня перенаправляют в нужную часть сайта, но все ссылки не работают. Браузер думает, что я в другой папке?

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


person Walderman    schedule 07.04.2010    source источник


Ответы (2)


Вам нужен абсолютный путь, потому что браузеры оценивают относительные пути относительно текущего uri запроса (если вы не используете базовый тег, см. ниже). Имейте в виду, что абсолютный путь не обязательно означает, что вам нужно включать в него доменное имя. Достаточно просто начать с косой черты. Это, так сказать, абсолютный путь относительно сервера.

So:

<img src="/images/bla.gif">

вместо

<img src="images/bla.gif">

... будет работать нормально.

Как я уже упоминал, другим подходом может быть использование базового тега. Но по причинам, которые я сейчас не могу вспомнить, я считаю, что рекомендуется не использовать его. (Если кто-то еще хочет присоединиться сюда...)

person Decent Dabbler    schedule 07.04.2010
comment
да. Это то, что я делал, хотя я не знаком с тегом ‹base›. Я должен буду видеть, что слово об этом. - person Walderman; 08.04.2010
comment
Но как теперь запустить несколько веб-сайтов на локальном хосте? - person Petah; 07.02.2011
comment
@Walderman Я слышал о проблемах с использованием базового тега с некоторыми готовыми фреймворками, в зависимости от настройки. Использование базового тега — это нормально, особенно если вы контролируете мир. - person Anthony Rutledge; 14.03.2017

Изображения IMO, JavaScript, стили и другой статический контент не должны быть частью системы маршрутизации. Это означает, что вы загружаете PHP для каждого запроса (удар по производительности), тогда как Apache может нормально обслуживать эти файлы.

Мой .htaccess всегда позволяет существующим файлам пропускать PHP:

# Files with an extension that exist are served up straight.
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .* - [L]
person Amy B    schedule 07.04.2010
comment
Моя система не маршрутизирует для этих вещей. Они обслуживаются простыми старыми файлами. - person Walderman; 08.04.2010
comment
Хорошая логика и креатив, но ненужный. - person Anthony Rutledge; 14.03.2017