Папка public и веб-сервер
В приложении на Slim нет отдельных файлов для каждой страницы. Все запросы — /, /about, /posts/5 — принимает один файл public/index.php, а он уже решает, какой код выполнить. Такой файл называют единой точкой входа (front controller).
Зачем папка public
Корнем сайта делают не папку проекта, а только public. Браузеру доступно лишь то, что лежит в ней:
blog/
├── public/ ← корень сайта
│ └── index.php
├── vendor/ ← снаружи недоступно
└── composer.json ← снаружи недоступноВ public кладут index.php, а позже — стили, скрипты и картинки. Код, настройки и пароли остаются выше и по адресу сайта не открываются.
Встроенный сервер
Команда из прошлого урока уже делает всё нужное:
php -S localhost:8080 -t publicЕсли для адреса нет файла в public, встроенный сервер сам передаёт запрос в index.php. Настоящим веб-серверам это правило нужно указать явно.
Apache
Создайте вручную файл public/.htaccess:
# public/.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]Правило читается так: если запрошен не существующий файл и не папка — выполнить index.php. Файл public/css/style.css сервер отдаст сам, а /posts/5 попадёт в Slim. В настройках сайта корневой папкой (DocumentRoot) должна быть указана blog/public, а модуль mod_rewrite — включён.
Nginx
В Nginx то же правило записывают в настройках сайта:
server {
server_name blog.example.com;
root /var/www/blog/public;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
}
}Строка try_files сначала ищет файл, а если его нет — передаёт запрос в index.php.
Сайт в подпапке
Если сайт открывается не с корня домена, а по адресу вида example.com/blog/, сообщите Slim начало адреса:
// public/index.php
$app = AppFactory::create();
$app->setBasePath('/blog');После этого маршрут /about будет отвечать на адрес /blog/about.
Частая ошибка
Если корнем сайта указана папка проекта, а не public, по адресу /composer.json или /vendor/... любой посетитель может открыть внутренние файлы. А если на Apache главная страница работает, но все остальные адреса отдают ошибку 404 самого сервера — не сработало правило из .htaccess: проверьте, что файл лежит именно в public и что mod_rewrite включён.