IwanQ
@IwanQ
Плохие времена часто дают прекрасные возможности

Почему появляется ошибка 500?

Здравствуйте. Решил загрузить на хостинг сайт.

После выгрузки, появилась ошибка 500 и сайт не работал.

Написал в техподдержку хостинга.

Ошибка была следующего вида: Warning: require_once ...../src/Controllers/MainController.php ......index.php on line 4

Файл routes был:

<?php
return [
   '~^(.+)$~' => [\Controllers\ArticlesController::class, 'view'],
  '~^$~' => [\Controllers\MainController::class, 'main']
];


Техподдержка заменила так:
'~^(.+)$~' => [\Controllers/ArticlesController::class, 'view'],
  '~^$~' => [\Controllers/MainController::class, 'main']


Не помогло.

Тот самый MainController

<?php
namespace Controllers;
use View\View;
use Services\Db;
use Models\Articles\Article;

class MainController{
private $view;

  public function __construct(){
        $this->view = new View(__DIR__ . '/../templates');
        $this->db = new Db();
  }
  public function main(){
    $articles = Article::findAll();
    $this->view->renderHtml('main/main.php', ['title' => 'Главная',
                                                  'description' => 'description',
                                                  'keywords' => 'keywords',
                                                  'articles' => $articles]);
    }
}


index.php

<?php
try{
spl_autoload_register(function (string $className){
  require_once __DIR__ . '/src/' . $className . '.php';
});

$route = $_GET['route'] ?? '';
$routes = require __DIR__ . '/src/Settings/routes.php';

$isRouteFound = false;
foreach ($routes as $pattern => $controllerAndAction) {
    preg_match($pattern, $route, $matches);
    if (!empty($matches)) {
        $isRouteFound = true;
        break;
    }
}

if (!$isRouteFound) {
    throw new \Exceptions\NotFoundException();
}

unset($matches[0]);

$controllerName = $controllerAndAction[0];
$actionName = $controllerAndAction[1];

$controller = new $controllerName();
$controller->$actionName(...$matches);

} catch (\Exceptions\NotFoundException $e) {
  $view = new \View\View(__DIR__ . '/src/templates/errors');
  $view->renderHtml('404.php', ['error' => $e->getMessage()], 404);
}
?>


htaccess

RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

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


Если я запускаю на open server все прекрасно работает.

Подскажите пожалуйста в чем может быть проблема?

P.S. Все пути, которые не были найдены я дописал, сайт заработал, НО:
1) я подключал руками не все файлы, а некоторые
2) значит ошибка в spl_autoload_register, может кто-нибудь знает почему?
  • Вопрос задан
  • 101 просмотр
Решения вопроса 1
@NinjaNickName
Web разработчик
Пути файлов в linux используют "/" для разделения каталогов в адресе.
Пути файлов в Windows используют "\" для разделения каталогов в адресе.

Полагаю из-за этого и возникли ошибки при переносе, поправьте autoload и все заработает.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
irishmann
@irishmann
Научись пользоваться дебаггером
Настройте вывод ошибок, пример
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы