У меня проблема с переписыванием URL-адресов. Я закодировал небольшую структуру для себя, потому что мне не нужна полноразмерная структура с большим количеством материалов для моих проектов. Я определил общее поведение, как в Zend Framework:[mod_rewrite]: Проблемы с перенаправлением
Переписан URL: домен/контроллер/действие
Реальный путь: домен/index.php Ctrl = контроллер & действие = действие
контроллера и действия должны быть вместо него - $ _GET. После контроллера и действия, если я добавляю бесконечное количество дополнительных параметров, его следует добавить в качестве ключа/значения следующим образом:
домен/контроллер/действие/ключ/значение/ключ2/значение2/ключ3/значение3 ...
Это мой .htaccess:
RewriteEngine On
RewriteBase/
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act2=$2&$3=$4&$5=$6 [L]
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4 [L]
RewriteRule ^([\w-]+)+/([\w-]+)?$ index.php?ctrl=$1&act=$2 [L]
RewriteRule ^([\w-]+)+/?$ index.php?ctrl=$1 [L]
страница может вызываться только с контроллера и действия. Если один из них отсутствует, пользователь будет перенаправлен. Я установил для этого заголовки:
// Redirects
if (!isset($_GET) || !isset($_GET['ctrl'])) {
header('location: /index/index/');
}
if (!isset($_GET['act']) || (isset($_GET['act']) && empty($_GET['act']))) {
header("location: /".$_GET['ctrl']."/index/");
}
Это грязный я знаю. Обычно это работает, но есть некоторые проблемы, которые я не могу решить:
если я пытаюсь вызвать веб-приложение с доменом/страница не может быть отображена или я буду перенаправлен на Google с поиском "домен/". Если я набираю домен/контроллер/действие, он работает.
Если после действия добавить завершающую косую черту, она заканчивается на 404. Это должно быть такое же поведение, как и без косой черты.
Если я добавляю косую черту перед контуром в заголовке ('location: ... он работает для следующего шаблона: domain/controller. Он будет перенаправлен в домен/контроллер/действие (в этом случае контроллер/индекс)
Но если я пытаюсь область/это приводит к 404.
Без слэш перед:.
домена/контроллер/результатов в области/контроллер/контроллер/действие, но домен/будет правильно перенаправлен на домен/индекс/индекс
Что мне не хватает? :(
Благодаря
Tyr
тьфу, пожалуйста, разобрать URL в вашем PHP и просто пересылать все запросы в ваш PHP-файл, а не использовать такие уродливые URL-адреса ... Кроме того, просто отображать параметры querystring их имена в сегментах маршрута не будут давать вам очень чистые URL-адреса ... – ThiefMaster
Я не знаю, что вы имеете в виду с «не очень чистыми» URL-адресами, но «domain/user/edit/id/3» выглядит очень чистым для меня – Tyr
Взять этот вопрос в качестве примера. 'http: // stackoverflow.com/questions/25974343/mod-rewrite-problems-with-redirecting' приятно, но с вашей системой это будет, например, 'http: // stackoverflow.com/questions/id/25974343/title/mod-rewrite-problems-with-redirecting' – ThiefMaster