Задать вопрос
SparkyToster
@SparkyToster
PHP (Laravel) developer, student, human being.

Почему не работает сайт на хостинге (возможно из-за .htaccess)?

Учился разрабатывать новостной-блог сайт на локальной машине у себя на ноутбуке OSPanel, Apache-7.2-PHP, PHP 7.2 x64. Windows 10

На сайте реализовал роутинг и сделал фронт-контроллер, все работает отлично. Но когда начал переносить на хостинг - все летит :(.
Сначала думал на spl_auto_register(), сделал автозагрузку через Composer. Я так полагаю, что проблема либо в загрузке классов либо в том, что не срабатывает второй .htaccess файл, который перенаправляет на фронт-контроллер index.php и устанавливает $_GET атрибут, который в дальнейшем я использую для роутинга, потому что когда пытаюсь его вывести через echo уже все ломается, ошибок не вижу ибо прилетает error 500 (хостинг бесплатный Beget). В коде снизу приложу структуру своего проекта, .htaccess файл (второй), который перенаправляет на index.php и свой index.php.
Жду помощи, другой код могу тоже кинуть по надобности!

структура проекта:
5bba11a465328081396439.png

index.php:
use MyProject\View\View;

try
{
    require __DIR__ . '/../vendor/autoload.php';
    $route = $_GET['route'] ?? '';
    $routes = require __DIR__ . '/../src/routes.php';
    $isRouteFound = false;
    foreach ($routes as $pattern => $controllerAndAction)
    {
        preg_match($pattern, $route, $matches);
        if (!empty($matches)) {
            $isRouteFound = true;
            break;
        }
    }
    if (!$isRouteFound)
    {
        throw new \MyProject\Exceptions\NotFoundException();
    }
    unset($matches[0]);
    $controllerName = $controllerAndAction[0];
    $actionName = $controllerAndAction[1];
    if (method_exists($controllerName, $actionName))
    {
        $controller = new $controllerName();
        $controller->$actionName(...$matches);
    } else
        {
        $view = new View(__DIR__ . '/../templates');
        $view->renderHtml('errors/404.php', [], 404);
        return;
    }
} catch (\MyProject\Exceptions\DbException $e)
{
    $view = new View(__DIR__ . '/../templates/errors');
    $view->renderHtml('500.php', ['error' => $e->getMessage()], 500);
} catch (\MyProject\Exceptions\NotFoundException $e)
{
    $view = new View(__DIR__ . '/../templates/errors');
    $view->renderHtml('404.php', ['error' => $e->getMessage()], 404);
} catch (\MyProject\Exceptions\UnauthorizedException $e)
{
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('401.php', ['error' => $e->getMessage()], 401);
} catch (\MyProject\Exceptions\Forbidden $e)
{
    $view = new \MyProject\View\View(__DIR__ . '/../templates/errors');
    $view->renderHtml('403.php', ['error' => $e->getMessage()], 403);
}


.htaccess который должен перенаправлять запросы из webroot/ на webroot/index.php :
<IfModule mod_rewrite.c>
RewriteEngine On

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

RewriteRule ^(.*)$ ./index.php?route=$1 [QSA,L]
</IfModule>
  • Вопрос задан
  • 950 просмотров
Подписаться 1 Простой 3 комментария
Пригласить эксперта
Ответы на вопрос 1
SagePtr
@SagePtr
Еда - это святое
А регистр имён файлов правильный? Если разрабатывать на винде, можно не учесть этот аспект, а на других ОС - это важно.

Если логов ошибок на хостинге нет - то либо поищите их (может быть, они хитро запрятаны), либо бегите подальше от такого хостера, в случае любой проблемы вы будете либо слепым котёнком, либо вангой.
Ответ написан
Ваш ответ на вопрос

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

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