Итак, необходимо было перенести сайт сделанный на каркасе для создания 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 /