Фреймворк CakePHP — переезд на новый хостинг

Итак, необходимо было перенести сайт сделанный на каркасе для создания web-приложений CakePHP и написанный на языке PHP.

После переноса содержимого на хостинг и настройки параметров базы данных и т.д., в предвкушении уже работающего сайта, был обломан сообщением: 500 Internal Server Error

Пришел к выводу, что это вызвано проблемами с файлами .htaccess, а их в данном фреймворке 3

1 — в корне сайта

Содержимое:

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

RewriteRule (.*) app/webroot/$1 [L]

</IfModule>

2 — в папке app

Содержимое:

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

</IfModule>

3 — в папке webroot

Содержимое:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
</IfModule>

 

Как видим используется mod_rewrite.c

Далее приведу текст с сайта http://cake-php.net/:

Хотя CakePHP и настроен изначально таким образом чтобы работать сразу с mod_rewrite — мы заметили что у некоторых пользователей не выходит получить красивые URL-адреса, и они ведут непримиримую борьбу с настройками. Вот несколько советов, которые помогут заставить работать все так, как вам бы того хотелось:

Убедитесь что на сервере разрешено переопределение директив настройки при помощи файлов .htaccess. Для этого в файле httpd.conf, в разделе, определяющем ваш каталог на сервере, директива Allow Override должна быть установлена в значение All.
Убедитесь, что вы редактируете httpd.conf, относящийся ко всему серверу, а не конкретному пользователя или сайту.
Возможно, у вас просто отсутствует .htaccess файл. Такое могло произойти при загрузке архива Cake, т.к. некоторые системы считаю файлы, начинающиеся с точки, скрытыми и не копируют их. Попробуйте заново загрузить архив, если это ваш случай.
Убедитесь, что происходит корректно загрузка модуля mod_rewrite. Для этого найдите строки LoadModule rewrite_module libexec/httpd/mod_rewrite.so и AddModule mod_rewrite.c в вашем httpd.conf.
Если вы устанавливаете CakePHP в пользовательский каталог (вроде http://example.com/~username), то вам необходимо в вашем .htaccess файле добавить строку RewriteBase /myusername/.

Итак, поняв что не все так просто, решил проверить этот сайт на локальном ПК с

ОС Linux, Apache 2.2, PHP5, MySQL.

После того, как залил файлы и настроил, получаю все ту же ошибку 500 Internal Server Error.

Следующим шагом проверил работу модуля mod_rewrite. В результате оказалось, что модуль не настроен.

Следуя вышеперечисленным рекомендациям настроил web-сервер согласно особенностям ОС Linux.  У вас может быть другая ОС, соответственно и другие настройки. Описывать как подключить mod_rewrite не буду, т.к. в вашем конкретном случае настройки могут отличатся.

Итак, после корректной настройки mod_rewrite и директив Allow Override ( директива Allow Override должна быть установлена в значение All) все завелось, но радоваться было рано т.к. на хостинге все было по прежнему.

Ниже приведу части конфига web-сервера на своей локальной машине:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

<Directory /var/www>
Options FollowSymLinks
AllowOverride All
Order allow,deny
allow from all
</Directory>

Еще раз повторюсь, гуглите как подключить и настроить mod_rewrite в вашем конкретном случае в зависимости от ОС и сборки.

Вернемся к проблемному хостингу…

В поддержке хостинга узнал, что все дериктивы и модули подключены и настроены, что ошибки в коде, но как в коде если все работало на предыдущем хостинге и на локальном ПК…

Стал разбиратья…

Вначале в файлах .htaccess

добавлял строку

RewriteBase /

1 — в корне сайта

Содержимое:

<IfModule mod_rewrite.c>
RewriteEngine on

RewriteBase /
 RewriteRule ^$ app/webroot/ [L]

RewriteRule (.*) app/webroot/$1 [L]

</IfModule>

2 — в папке app

Содержимое:

<IfModule mod_rewrite.c>

RewriteBase /
RewriteEngine on
RewriteRule ^$ webroot/ [L]
RewriteRule (.*) webroot/$1 [L]

</IfModule>

3 — в папке webroot

Содержимое:
<IfModule mod_rewrite.c>

RewriteBase /
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?/$1 [QSA,L]
</IfModule>

Не помогло, вернул обратно, после в файлах .htaccess указывал пути в зависимости от выбранного каталога

RewriteBase /~путь в зависимости от каталога/

И в логах ошибок появилось сообщение:

Request exceeded the limit of 10 internal redirects due to probable configuration error

В общем, как только не пробовал с RewriteBase ничего не получалось…

Вернул все в первоисходное состояние, стал изучать логи web-сервера.

В логах увидел следующее:

[Thu Jul 11 13:07:08 2013] [error] [client 178.158.220.47] PHP Fatal error: Class ‘CakePlugin’ not found in /var/www/myname/data/www/mysite/app/Config/bootstrap.php on line 126
[Thu Jul 11 13:07:08 2013] [error] [client 178.158.220.47] PHP Warning: include(): open_basedir restriction in effect. File(/var/www/myname/mysite/lib/Cake/Core/CakePlugin.php) is not within the allowed path(s): (/var/www/myname/data:.) in /var/www/myname/data/www/mysite/lib/Cake/Core/App.php on line 530
[Thu Jul 11 13:07:08 2013] [error] [client 178.158.220.47] PHP Warning: include(/var/www/myname/mysite/lib/Cake/Core/CakePlugin.php): failed to open stream: Operation not permitted in /var/www/myname/data/www/mysite/lib/Cake/Core/App.php on line 530
[Thu Jul 11 13:07:08 2013] [error] [client 178.158.220.47] PHP Warning: include(): Failed opening ‘/var/www/myname/myname/lib/Cake/Core/CakePlugin.php’ for inclusion (include_path=’.:/usr/share/php:/usr/share/pear’) in /var/www/myname/data/www/myname/lib/Cake/Core/App.php on line 530

Из этой записи видно, что не может найти файлы и библиотеки… Проблемы с путями.

Решением проблемы в моем случае оказалось настройка файла index.php (webroot)

Полез я в  файл index.php (webroot):

Нас интересует следующее:

if (!defined(‘ROOT’)) {
define(‘ROOT’, dirname(dirname(dirname(__FILE__))));
}

if (!defined(‘APP_DIR’)) {
define(‘APP_DIR’, basename(dirname(dirname(__FILE__))));
}

//define(‘CAKE_CORE_INCLUDE_PATH’, ROOT . DS . ‘lib’);

Эти строки были заменены на следующие:

if (!defined(‘ROOT’)) {
define(‘ROOT’, DS . ‘var’ . DS . ‘www’ . DS . ‘myname’ . DS . ‘data’ . DS . ‘www’ . DS . ‘mysite’);
}

if (!defined(‘APP_DIR’)) {
define(‘APP_DIR’, DS . ‘app’);
}

define(‘CAKE_CORE_INCLUDE_PATH’, DS . ‘var’ . DS . ‘www’ . DS . ‘myname’ . DS . ‘data’ . DS . ‘www’ . DS . ‘mysite’ . DS . ‘lib’);

DS в данном случае = знаку /

Кому интересно читайте на сайтах посвященных phpcake

После этого, по совету техподдержки хостинга  почистил папку tmp, т.к. в ней хранились файлы с предыдущего хостинга, и УРА, все заработало.

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

Мои рекомендации по переносу на хостинг фреймворка phpcake:

  • Прежде чем переносить данные на хостинг, уточнайте поддержку нужных модулей и директив.
  • Сразу же чистите папку tmp, возможно после этого все сразу заработает
  • Если не помогла чистка, настраивайте пути index.php (webroot)

В моем случае изменения в .htaccess не помогли. Хотя другим пользователям помогает RewriteBase /