2012-04-19 2 views
1

Я создаю блог-сайт с использованием CI. Я использую HMVC plugin. Модуль, над которым я работаю, - «/ journal».CodeIgniter + mod_rewrite URI сокращение

Доступ к отдельным статьям осуществляется в/journal/article/ID/SLUG. Это прекрасно работает, но я хотел бы сократить URI на/journal/ID/SLUG с помощью mod_rewrite.

Вот мои правила:

RewriteEngine On 
RewriteBase/

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^journal/([0-9]+)(.*)$ index.php?/journal/article/$1$2 [L,NC] 

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.*)$ index.php?/$1 

Для тестирования я использую/журнал/2.

Я знаю, что правила соответствуют. Если, например, я переадресую перенаправление на http://google.com, я действительно перенаправляюсь в Google. Однако, когда вы используете правило, как написано, оно, кажется, игнорируется, и я получаю 404 независимо от того, что я вставляю.

Я делаю некоторые очевидные (или тайные) ошибки?


Редактировать: Я понял это вскоре после размещения вопроса. Мои правила действительно правильно, но мне нужно изменить следующую строку в конфигурационном/config.php:

$config['uri_protocol'] = 'AUTO'; 

к

$config['uri_protocol'] = 'PATH_INFO'; 

Я не буду утверждать, чтобы точно знать, что делает это изменение или почему его исправляет проблему. Возможно, кто-то может объяснить объяснение.

ответ

1

$ config ['uri_protocol'] сообщает CI, который $ _SERVER суперглобальный, чтобы использовать для определения URI своих приложений. Параметр «PATH_INFO» использует $ _SERVER ['PATH_INFO'], который является запросом URL-адреса (без хост-части), см. php manual.

Опция «АВТО» - это вещь CI, которая подходит для разных сред без настроек конфигурации.

Лично я написал несколько контроллеров PHP SEF, я считаю, что лучше всего обработать с помощью скриптов PHP-контроллера.

htaccess и перезаписи могут быть сложными, сложнее отлаживать, а одна опечатка может убить весь сайт (ouch). Я уверен, что есть небольшой прирост производительности, но для этого потребуются довольно сложные требования. Вы все равно направляетесь к контроллеру index.php. Я нахожу более счастливый код, когда он все в одном месте ;-)

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

+1

Если вы посмотрите на строку 87 CodeIgniter file (system/core/URI.php) function _fetch_uri_string(), вы можете увидеть логику настройки AUTO. Короче говоря, он проверяет, вызывает ли командная строка (CLI), и проверяет PATH_INFO, QUERY_STRING и т. Д., Чтобы попытаться определить, какой URI вы захотите. Я хотел бы указать что-то помимо AUTO, так что вы точно знаете, что такое поведение. – stellablue