Я создавал API с помощью фреймворка Slim PHP, используя репозиторий готинкстера в качестве отправной точки. Код был сильно адаптирован, хотя весь код, относящийся к шаблонам рендеринга, остался нетронутым. Когда я захожу на домашнюю страницу веб-сайта, файл index.phtml отображается правильно, но переход по любым гиперссылкам с домашней страницы приводит к ошибке 404, хотя все файлы .phtml находятся в одном каталоге.
Ниже приведены выдержки из моего кода, исключая несущественную конфигурацию. Хотя я отображал только одну конечную точку, API определяет 10 конечных точек, все из которых являются запросами на получение без аргументов с использованием файлов .phtml, находящихся в одной папке.
Параметры, маршруты и зависимости вызываются с помощью операторов require в файле 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();
Файл настроек возвращает массив, содержащий ссылку на путь к шаблону.
'settings' => [
'renderer' => [
'template_path' => __DIR__ . '/../templates/',
]
]
Шаблоны назначаются рендереру в файле 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.
$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, я не могу просматривать домашнюю страницу или любые другие маршруты.
<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>
@Nima, спасибо, что указали на это. Я обновил свой ответ. Как я объясняю при редактировании, я фактически забыл создать символическую ссылку для файла .htaccess, но после ее добавления я даже не могу получить доступ к домашней странице, и меня перенаправляют на страницу apache по умолчанию.






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