LINUX.ORG.RU

Помогите с .htaccess для MVC

 , ,


0

1

Пишу свой движок на паттерне MVC, возник затык, казалось бы, банальный, с .htaccess

Сейчас он у меня выглядит вот так:

AddDefaultCharset utf-8
RewriteEngine on 
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)/(.*)$ /index.php?controller=$1&method=$2 [L,QSA]

Не получается вот что:

1. Сделать, чтобы адреса вида /a/b/ так же обрабатывались, как и /a/b (сейчас только /a/b без завершающего слеша работают)

2. Нужно, чтобы остальные параметры, если таковые будут, передавались в массив, т.е. типа такого index.php?controller=$1&method=$2&params[]=$3&params[]=$4

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

RewriteRule ^.*$ /index.php [L,QSA]

А потом в пхп скрипте смотри в $_SERVER урл и разбирай его там.

goingUp ★★★★★
()
Ответ на: комментарий от FlyBird11

да и как раз делать это через .htaccess - мешать мух и котлет

goingUp ★★★★★
()
Ответ на: комментарий от goingUp

Ок, как сделать пункт 1 для такого случая:

RewriteRule ^(.*)/(.*)$ /index.php?controller=$1&method=$2 [L,QSA]
Очевидно, что такую же строку со слешем на конце я не могу добавить.

FlyBird11
() автор топика
Ответ на: комментарий от FlyBird11

Я нашёл рабочий подходящий вариант и переделал под свои нужды, но я не очень понимаю, зачем здесь первые четыре RewriteCond:

AddDefaultCharset utf-8
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ /$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3&params[]=$4&params[]=$5 [L,QSA]
RewriteRule ^(.*)/(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3&params[]=$4 [L,QSA]
RewriteRule ^(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3 [L,QSA]
RewriteRule ^(.*)/(.*)$ /index.php?controller=$1&method=$2 [L,QSA]

FlyBird11
() автор топика
Ответ на: комментарий от FlyBird11

Даже вот так, наверное,

AddDefaultCharset utf-8
RewriteEngine on
RewriteBase /

RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} ![^\/]$
RewriteRule ^(.*)\/$ /$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3&params[]=$4&params[]=$5 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3&params[]=$4 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)/(.*) /index.php?controller=$1&method=$2&params[]=$3 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/(.*)$ /index.php?controller=$1&method=$2 [L,QSA]

FlyBird11
() автор топика

RewriteRule ^.*$ /index.php [L,QSA]

И парсить в скрипте. Если неймётся именно в .htaccess - контроллер/метод парси там, а остальную часть (параметры) передавай в скрипт. Но это очень кривое решение.

VeroLom ★★
()

Как уже сказали это плохая идея, роутинг должен быть в пхп свой и не зависеть от apache/nginx/iis/etc web server. Задача веб сервера просто вызвать нужный скрипт и передать ему параметры запроса.

Noob_Linux ★★★★
()

Апач не нужен

anonymous
()
Ответ на: комментарий от goingUp

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

Всегда можно сделать адреса что-то типа

/Category/Dev/Theme100500/Post201000/

И смысловая нагрузка у параметра есть и номер. Да даже если писать просто

/Category/Dev/100500/201000/
то пофиг, что оно не особо читаемо, метод Dev контроллера Category разберётся, что ему из этого нужно и как использовать.

FlyBird11
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.