Как организовать работу index.php на сервере для сайта

Раздел: -> Веб-сервер

Основные подходы к настройке index.php

Эффективное решение: использование index.php в качестве фронт-контроллера с маршрутизацией через веб-сервер

Этот способ позволяет перенаправлять все HTTP-запросы на один файл index.php, который затем самостоятельно обрабатывает маршруты. Такой подход применяется в современных фреймворках (Laravel, Symfony, Yii) и обеспечивает единую точку входа.

Для Apache необходимо включить модуль mod_rewrite и разместить в корневой директории файл .htaccess со следующим содержимым:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

Для Nginx аналогичная конфигурация выглядит так:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

Пример самого index.php с простой маршрутизацией:

<?
$request = $_SERVER['REQUEST_URI'];
switch (true) {
    case ($request === '/'):
        echo 'Главная страница';
        break;
    case (preg_match('#^/user/(\d+)$#', $request, $matches)):
        echo 'Пользователь с ID: ' . $matches[1];
        break;
    default:
        http_response_code(404);
        echo 'Страница не найдена';
}

Типичные проблемы и их решения:

  • Ошибка 500: Проверьте, включен ли модуль mod_rewrite (Apache) или параметр try_files (Nginx). Убедитесь, что файл .htaccess разрешен (AllowOverride All).
  • Запросы не перенаправляются: Убедитесь, что файл index.php существует и доступен для чтения. Проверьте права на директорию (обычно 755).
  • Бесконечное перенаправление: Убедитесь, что RewriteCond проверяет существование файла и директории перед перенаправлением.

Как сделать, чтобы index.php открывался по умолчанию без перенаправления всех запросов?

Если требуется только указать, какой файл загружается при обращении к корню сайта, достаточно настроить директиву DirectoryIndex. Для Apache:

DirectoryIndex index.php

Для Nginx в блоке server добавьте:

index index.php;

Цель:

Используется на статических сайтах, где index.php – единственный скрипт.

Как настроить встроенный сервер PHP для разработки с index.php?

PHP предоставляет встроенный сервер для тестирования. Запуск с указанием index.php как точки входа:

php -S localhost:8000 index.php

В этом случае все запросы обрабатываются файлом index.php, даже если ресурс физически существует. Цель: быстрое локальное тестирование маршрутизации.

Если index.php не обрабатывает запросы к статическим файлам (CSS, JS), добавьте проверку на существование файла внутри index.php или используйте маршрутизатор с условием.

Как сделать, чтобы index.php обрабатывал только определённые URL, а остальные отдавал как статику?

Пример для Apache с исключением некоторых путей:

RewriteRule ^(api|admin)/ index.php [L]
RewriteRule ^(.*\.php)$ index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

Цель: гибридная архитектура, где часть путей обрабатывается приложением, а часть – статические файлы.

Какой вариант выбрать? Если сайт использует роутинг (фреймворк) – обязательно фронт-контроллер. Если один скрипт без маршрутизации – достаточно DirectoryIndex. Для разработки – встроенный сервер.

Расширенные примеры настройки index.php

Пример 1. Полный фронт-контроллер с обработкой ошибок и автозагрузкой классов

Пример
<?php
// Автозагрузка классов (например, через composer)
require __DIR__ . '/vendor/autoload.php';

// Обработка ошибок
error_reporting(E_ALL);
ini_set('display_errors', 0);
set_error_handler(function ($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});

// Определение маршрута
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = [
    '/' => 'HomeController@index',
    '/user/{id}' => 'UserController@show',
    '/api/data' => 'ApiController@data',
];

// Простейший роутинг (для примера)
$matched = false;
foreach ($routes as $pattern => $action) {
    $pattern = preg_replace('/\{([a-z]+)\}/', '(?P<$1>[^/]+)', $pattern);
    if (preg_match('#^' . $pattern . '$#', $uri, $matches)) {
        $matched = true;
        list($controller, $method) = explode('@', $action);
        $instance = new $controller;
        echo call_user_func_array([$instance, $method], array_values(array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY)));
        break;
    }
}

if (!$matched) {
    http_response_code(404);
    echo json_encode(['error' => 'Not Found']);
    header('Content-Type: application/json');
}

Результат при запросе /user/42:

(Вывод метода show класса UserController с параметром 42)

Пример 2. Конфигурация Nginx с обработкой статики и передачей PHP-FPM

Пример
server {
    listen 80;
    server_name example.com;
    root /var/www/project/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~* \.(css|js|jpg|png)$ {
        expires 30d;
        access_log off;
    }
}

Проверка: при запросе /style.css файл будет отдан напрямую (не через index.php), а /user/profile будет перенаправлен в index.php.

Пример 3. Использование встроенного сервера с кастомным маршрутизатором

Пример
// router.php
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js)$/', $uri)) {
    return false; // отдать статику напрямую
}
// иначе обработать через index.php
define('APP_START', microtime(true));
require 'index.php';

// Запуск:
// php -S localhost:8000 router.php

Результат: запросы к изображениям и стилям не нагружают index.php.

Пример 4. Настройка .htaccess для поддиректорий (если сайт размещён не в корне)

Пример
RewriteEngine On
RewriteBase /subfolder/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]

Важно: RewriteBase должен совпадать с путём от корня домена до папки с index.php.

Пример 5. Защита index.php от прямого доступа (если используется как точка входа)

Пример
// В самом начале index.php
if (php_sapi_name() === 'cli-server') {
    // разрешить доступ при использовании встроенного сервера
} elseif (!defined('APP_ENTRY')) {
    define('APP_ENTRY', true);
    // дополнительная проверка, что доступ идёт через веб-сервер
    $allowed_hosts = ['example.com', 'www.example.com'];
    if (!in_array($_SERVER['HTTP_HOST'], $allowed_hosts)) {
        http_response_code(403);
        echo 'Доступ запрещён';
        exit;
    }
}

Результат: при прямом вызове index.php через CLI или неавторизованный хост будет ошибка 403.

Пример 6. Команда для отладки маршрутизации в Apache

Пример
# Включение лога rewrite
RewriteLog "/var/log/apache2/rewrite.log"
RewriteLogLevel 3

После перезапуска Apache в логе будет видно, как применяются правила. Внимание: в новых версиях (2.4+) вместо этого используется модуль mod_rewrite с директивой LogLevel.

- Apache php (apache и php)
- Install php (установка php)
- Php http 2 (php и http/2)
- Nginx php (настройка nginx для php)
- Php fpm (php-fpm (fastcgi process manager))
- Php server https (настройка https на сервере php)
- Site index php (настройка index.php для сайта)
- Php http server (http сервер на php)
- Default php (файл по умолчанию (default.php) в php)
- Redirect php https (редирект на https в php)

Настройка index.php для сайта - comments

En
Site index php (php)