developer.co.ua

Holy Copypasters
20.10.2006
Андрей Друченко

CakePHP & mod_rewrite 0.03

В последней версии CakePHP (на момент написания этого документа – 1.1.6.3264) при установке Сake на win32, PHP 4.4.1 + Apache 1.3 обнаруживаются проблемы по части файлов .htaccess. Проблема заключаюется в том что файл .htaccess, в самом корне Cake содержащий

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule    ^$ app/webroot/    [L]
    RewriteRule    (.*) app/webroot/$1 [L]
</IfModule>


не работает.

По этому поводу вспомним замечательные слова
«Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. ''
— Brian Moore, bem@news.cmc.net


mod_rewrite — это модуль веб-сервера Apache httpd. Этот модуль используется для преобразования URL, а именно для того чтобы делать все URL на сайте человекопонятными (в русских сокращениях это сейчас называют ЧПУ — ЧеловекоПонятныйУрл).

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

Возможно, проблема связана с некорректными настройками Apache, или тем что PHP работает через CGI — неизвестно, но после многочасового ковыряния в настройках httpd.conf, проблема так и не решилась, поэтому решено было переписать корневой .htaccess и попутно решить другую проблему — невозможности изменять DocumentRoot на большинстве shared-хостингов. В оригинальной документации по CakePHP разработчики Cake советуют менять DocumentRoot при выкладывании production версии на рабочий хост(Section 4, production setup), а именно — требуется установить DocumentRoot сервера на папку /app/webroot/. Также с оригинальными файлами .htaccess из поставки Cake — не работает и development environment.

Но поскольку мы не беспомощные, и кое-что понимаем в том как работают все эти хитрые перенаправления, и сами когда-то писали MVC фреймворк, то вот предложенное решение в виде нового файла .htaccess

RewriteEngine On
RewriteBase /


RewriteRule ^img/(.*)$     /app/webroot/img/$1 [L]
RewriteRule ^css/(.*)$     /app/webroot/css/$1 [L]
RewriteRule ^files/(.*)$   /app/webroot/files/$1 [L]
RewriteRule ^js/(.*)$      /app/webroot/js/$1 [L]
RewriteRule ^favicon.ico$  /app/webroot/favicon.ico [L]



RewriteCond %{REQUEST_URI} !^/app/webroot/index.php
RewriteCond %{REQUEST_URI} !^/img
RewriteCond %{REQUEST_URI} !^(.*)/js
RewriteCond %{REQUEST_URI} !^(.*)/css
RewriteCond %{REQUEST_URI} !^(.*)/favicon.ico

RewriteRule ^(.*)$  /app/webroot/index.php?url=$1 [QSA, L]


Проясним немного логику работы, описанную в этом файле.

Первый блок директив RewriteRule говорит mod_rewrite о том, что все URL начинающиеся на img/, css/, files/, js/ а также favicon.ico следует перенапрявлять в соответствующие директории(и файлы) /app/webroot/. Обозначение [L] — дает команду mod_rewrite прекратить обработку последующих правил, и выйти из цикла обработки правил. Также возможен флаг [R] — это явный редирект на указанный перед флагом URL (В ответе от Apache в HTTP заголовках выдается Location: http://yoururl.com/url/ )

Второй блок правил RewriteCond — это условия выполнения последнего правила RewriteRule. А именно, все эти RewriteCond действуют как один большой IF, который выполняет последнее правило при условии что URL *не* начинается (префикс “!" во всех регулярных выражениях) на /app/webroot/index.php, и не на /img, и не на /css, и не на /js, и не на /css и т.п. Флаг [QSA, L] сообщает что указанному URL также надо передать всю информацию из {$QUERY_STRING}, т.е. все GET запросы.

Невооруженным глазом понятно, что решение немного кривовато — но главное его преимущество в том что оно работает :) Кто придумал более изящный вариант, прошу поделиться.

Читаем также:

Подробная документация по mod_rewrite по-русски
Руководство по преобразованиям URL 
Оригинальная документация mod_rewrite от Apache Group на английском
CakePHP manual

1 2 3 4 5

Последние комментарии:

Документация Женя
Вот еще документация по CakePHP на русском языке: http://cake-php.ru

Zobzn
.htaccess работает нормально
Просто настроить нужно чуть-чуть по другому
Смотри http://www.tm4y.co.za/cakephp/absolute-beginners-guide-to-cakephp-windows.html

error500

вот вам корень всех проблем
файлы с имнами начинающимися с точки оченнь проблемны в мелкомягкой среде

Обсудить (комментариев: 3)