Slim PHP framework 3.0: ошибка 404 при доступе к маршрутам шаблона .phtml

Конфигурация сервера:

  • Ubuntu 18.04
  • Apache 2.4.29
  • PostgreSQL 10.6
  • PHP 7.3 (я использовал 7.2, но система решила обновить его за меня, я сделаю откат, как только исправлю текущие ошибки)
  • Композитор
  • Тонкий / Тонкий 3.0
  • Тонкий / php-просмотр

Я создавал API с помощью фреймворка Slim PHP, используя репозиторий готинкстера в качестве отправной точки. Код был сильно адаптирован, хотя весь код, относящийся к шаблонам рендеринга, остался нетронутым. Когда я захожу на домашнюю страницу веб-сайта, файл index.phtml отображается правильно, но переход по любым гиперссылкам с домашней страницы приводит к ошибке 404, хотя все файлы .phtml находятся в одном каталоге.

Ниже приведены выдержки из моего кода, исключая несущественную конфигурацию. Хотя я отображал только одну конечную точку, API определяет 10 конечных точек, все из которых являются запросами на получение без аргументов с использованием файлов .phtml, находящихся в одной папке.

Параметры, маршруты и зависимости вызываются с помощью операторов require в файле index.php.

/[api_root ]/public/index.php:

if (PHP_SAPI == 'cli-server') {

    $url  = parse_url($_SERVER['REQUEST_URI']);

    $file = __DIR__ . $url['path'];

    if (is_file($file)) {

        return false;

    }
}

require __DIR__ . '/../vendor/autoload.php';

session_start();

// Instantiate the app
$settings = require __DIR__ . '/../src/settings.php';

$app = new \Slim\App($settings);

// Set up dependencies
require __DIR__ . '/../src/dependencies.php';

// Register middleware
require __DIR__ . '/../src/middleware.php';

// Register routes
require __DIR__ . '/../src/routes.php';

// Run app
$app->run();

Файл настроек возвращает массив, содержащий ссылку на путь к шаблону.

[api_root] /src/settings.php:

'settings' => [
    'renderer' => [
        'template_path' => __DIR__ . '/../templates/',
    ]
]

Шаблоны назначаются рендереру в файле dependencies.php.

[api_root] /src/dependencies.php:

$container = $app->getContainer();

// view renderer
$container['renderer'] = function ($c) {
    $settings = $c->get('settings')['renderer'];
    return new Slim\Views\PhpRenderer($settings['template_path']);
};

Шаблоны .phtml обрабатываются в запросах get.

[api_root] /src/routes.php

$app->get('/getting-started',
    function (Request $request, Response $response) {
        return $this->renderer->render($response, 'getting-started.phtml');
    });

Файл getting-started.phtml находится в [api_root]/templates/.

Корневой / определен и успешно возвращает файл index.phtml, расположенный в каталоге шаблонов, но когда я пытаюсь перейти по любым ссылкам с домашней страницы, я получаю ошибку 404. Якорь, указывающий на начальную страницу, успешно перенаправляет на mywebsiteurl.com/getting-started, но файл шаблона не отображается, и браузер отвечает ошибкой 404.

Все файлы приложения хранятся на сервере в частном порядке. Я создал символические ссылки из содержимого папки [api_root]/public в папку public_html моего веб-сайта.

Очевидно, что что-то не так с моим определением пути к каталогу /templates, но я не могу понять, как это исправить.

Обновлено:

Когда я создавал символические ссылки на папку public_html, я забыл включить скрытые файлы (а именно файл .htaccess). С тех пор я создал эту символическую ссылку, хотя теперь, когда я пытаюсь получить доступ к домашней странице, я вижу страницу apache2 по умолчанию, которая отображается после установки apache. Замечу здесь, что сайт находится на платном сервере. Apache настроен на использование виртуальных хостов, и я правильно отредактировал файл hosts на своем локальном компьютере. Как уже говорилось, без файла .htaccess я могу просмотреть домашнюю страницу, но другие маршруты не найдены. Когда файл .htaccess существует в папке public_html, я не могу просматривать домашнюю страницу или любые другие маршруты.

.htaccess:

<IfModule mod_rewrite.c>
  RewriteEngine On

  RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$
  RewriteCond %{HTTP_HOST} ^(www\.)?mywebsiteurl.com
  RewriteRule ^(.*) - [E=BASE:%1]
  
  # If the above doesn't work you might need to set the `RewriteBase` directive manually, it should be the
  # absolute physical path to the directory that contains this htaccess file.
  # RewriteBase /

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^ index.php [QSA,L]
</IfModule>

Ошибка 404 не означает, что ваше приложение не может найти файл getting-started.phtml. Вероятно, это связано с файлом .htaccess. Не могли бы вы добавить содержание этого файла к своему вопросу?

Nima 24.11.2018 13:45

@Nima, спасибо, что указали на это. Я обновил свой ответ. Как я объясняю при редактировании, я фактически забыл создать символическую ссылку для файла .htaccess, но после ее добавления я даже не могу получить доступ к домашней странице, и меня перенаправляют на страницу apache по умолчанию.

Joshua Flood 25.11.2018 02:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
163
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что я не включил mod_rewrite на сервере, поэтому мой файл .htaccess не читался.

Другие вопросы по теме