Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Папка 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 включён.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.