2014-09-22 4 views
-2

У меня проблема с переписыванием 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/"); 
} 

Это грязный я знаю. Обычно это работает, но есть некоторые проблемы, которые я не могу решить:

  1. если я пытаюсь вызвать веб-приложение с доменом/страница не может быть отображена или я буду перенаправлен на Google с поиском "домен/". Если я набираю домен/контроллер/действие, он работает.

  2. Если после действия добавить завершающую косую черту, она заканчивается на 404. Это должно быть такое же поведение, как и без косой черты.

  3. Если я добавляю косую черту перед контуром в заголовке ('location: ... он работает для следующего шаблона: domain/controller. Он будет перенаправлен в домен/контроллер/действие (в этом случае контроллер/индекс)

Но если я пытаюсь область/это приводит к 404.

Без слэш перед:.

домена/контроллер/результатов в области/контроллер/контроллер/действие, но домен/будет правильно перенаправлен на домен/индекс/индекс

Что мне не хватает? :(

Благодаря

Tyr

+1

тьфу, пожалуйста, разобрать URL в вашем PHP и просто пересылать все запросы в ваш PHP-файл, а не использовать такие уродливые URL-адреса ... Кроме того, просто отображать параметры querystring их имена в сегментах маршрута не будут давать вам очень чистые URL-адреса ... – ThiefMaster

+1

Я не знаю, что вы имеете в виду с «не очень чистыми» URL-адресами, но «domain/user/edit/id/3» выглядит очень чистым для меня – Tyr

+0

Взять этот вопрос в качестве примера. 'http: // stackoverflow.com/questions/25974343/mod-rewrite-problems-with-redirecting' приятно, но с вашей системой это будет, например, 'http: // stackoverflow.com/questions/id/25974343/title/mod-rewrite-problems-with-redirecting' – ThiefMaster

ответ

0

Я думаю, что вы забыли это:

rewritecond %{http_host} ^yoururl.com/ [nc] 
rewriterule ^(.*)$ http://yoururl.com/$1 [r=301,nc] 

Этот код должен идти под:

RewriteBase/
+1

Спасибо. Я не знал, добавить URL-адрес в файл .htaccess, но это кажется неизбежным. Он работает сейчас. – Tyr

+0

Ну, htaccess должен знать, откуда переписать .. Вот почему URL-адрес обязательно. – Naruto

Смежные вопросы