Конфигурирование перенаправления запросов на index.php через .htaccess

Раздел: Администрирование веб-сервера -> Настройка веб-сервера Apache

Варианты настройки .htaccess для index.php

Файл .htaccess позволяет управлять поведением Apache на уровне директории. Настройка для index.php часто требуется для реализации единой точки входа (фронт-контроллера) и чистых URL. Ниже представлены различные подходы.

Как через mod_rewrite перенаправить все запросы на index.php?

Это наиболее эффективное и гибкое решение. Оно требует включённого модуля mod_rewrite. Правила размещают в корневом .htaccess проекта.

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

Allow index php (директива allow для index.php в apache)

Объяснение каждой директивы:
RewriteEngine On - активирует механизм преобразования URL.
RewriteCond %{REQUEST_FILENAME} !-f - проверяет, что запрашиваемый путь не является существующим файлом.
RewriteCond %{REQUEST_FILENAME} !-d - проверяет, что путь не является существующей директорией.
RewriteRule ^(.*)$ index.php [QSA,L] - все остальные запросы передаются на index.php; флаг QSA сохраняет строку запроса, L останавливает дальнейшую обработку правил.

Какие проблемы возникают при использовании mod_rewrite?

Самая частая ошибка - циклический редирект (ошибка 500), возникающий, если не указаны условия !-f и !-d, либо если index.php не существует. Решение: проверить пути к статическим файлам и настроить исключения. Другая проблема - модуль mod_rewrite отключён. Включение в Ubuntu/Debian: sudo a2enmod rewrite; в CentOS - раскомментировать строку LoadModule rewrite_module modules/mod_rewrite.so в httpd.conf. Также возможен конфликт с другими правилами в .htaccess - следует располагать блок RewriteEngine в начале.

Как использовать FallbackResource для упрощённой маршрутизации?

Директива FallbackResource появилась в Apache 2.2.16 и не требует mod_rewrite. Она задаёт обработчик для всех запросов, не соответствующих реальным файлам или директориям.

FallbackResource /index.php

редирект index php (редирект через index.php)

Этот способ проще, но менее гибок: нельзя добавить дополнительные условия. Если запрос ведёт к несуществующему файлу в подпапке, Apache всё равно передаёт его index.php, но путь в переменной REQUEST_URI сохраняется.

Проблема: FallbackResource не различает типы файлов - все запросы к несуществующим путям отправляются на index.php, включая статику (CSS, JS, изображения), если они не существуют физически. Решение: использовать только если все медиафайлы точно существуют, либо комбинировать с RewriteCond.

Как настроить DirectoryIndex в сочетании с ErrorDocument?

Этот вариант подходит, если нужно показывать index.php для корневой директории, а все несуществующие пути обрабатывать как 404.

DirectoryIndex index.php
ErrorDocument 404 /index.php

Htaccess index php (настройка .htaccess для index.php)

DirectoryIndex указывает, что при обращении к директории Apache показывает index.php. ErrorDocument 404 перенаправляет ошибки 404 на index.php, который может обработать запрос. Однако реальные файлы всё равно будут доступны напрямую.

Недостаток: при запросе несуществующей страницы (например, /about) браузер сначала получит HTTP 404, а затем редирект на index.php. Это может мешать SEO и не даёт чистых URL в смысле кода ответа. Решение: mod_rewrite с флагом R=200 не сработает, лучше использовать FallbackResource или mod_rewrite.

Как комбинировать mod_rewrite с исключением статических ресурсов?

Для фреймворков часто требуется дополнить базовое правило, чтобы не перенаправлять запросы к файлам с определёнными расширениями.

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.(css|js|jpg|png|gif|ico|svg|woff2?|ttf|eot)$ [NC]
RewriteRule ^(.*)$ index.php [QSA,L]

Дополнительное условие с ! \.(расширения) пропускает статические файлы, даже если они не существуют на диске (хотя на практике они должны существовать).

Важно: порядок условий имеет значение. Если после RewriteRule есть другие правила, может возникнуть перезапись. Следует помещать этот блок в начале .htaccess и избегать флага L в других правилах, если они расположены выше.

Расширенные примеры конфигурации .htaccess

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

Пример 1: Обработка подкаталогов с сохранением пути

Пример
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /index.php?path=$1 [QSA,L]
Запрос: /blog/article-123
Результат: Apache вызывает /index.php?path=blog/article-123&... (строка запроса сохранена)
Доступ к index.php с параметром path, который может быть обработан PHP.

Этот вариант явно передаёт путь как GET-параметр, что удобно для фреймворков, которые анализируют $_GET['path'].

Пример 2: Использование FallbackResource с редиректом для поддиректории

Пример
<IfModule mod_dir.c>
    FallbackResource /subdir/index.php
</IfModule>
Если в каталоге /subdir/ нет реального файла (например, /subdir/api/v1), запрос обрабатывается /subdir/index.php.
Работает только для запросов внутри /subdir/; корневой FallbackResource не применяется.

Можно устанавливать разные FallbackResource для разных подкаталогов, что полезно при модульной структуре.

Пример 3: Исключение robots.txt и favicon.ico из маршрутизации

Пример
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/robots\.txt$ [OR]
RewriteCond %{REQUEST_URI} ^/favicon\.ico$
RewriteRule ^ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
Запрос /robots.txt - не обрабатывается index.php, возвращается реальный файл (если существует).
Запрос /about - передаётся index.php.
Порядок: сначала обрабатываются исключения, затем общее правило.

Такой подход предотвращает лишнюю нагрузку на PHP для системных запросов.

Пример 4: Обработка index.php для фреймворка (Laravel)

Пример
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /public/index.php [QSA,L]
Если проект живёт в подкаталоге /project, а публичная директория - /project/public, то правило направляет все нестатические запросы в /public/index.php.
Обратите внимание: путь RewriteRule указывает относительно DocumentRoot.

Для Laravel типовой .htaccess уже содержит эти правила, но с учётом наличия папки public. Если проект размещён в корне, путь меняется на index.php.

Пример 5: Перенаправление с http на https с сохранением index.php обработки

Пример
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
При запросе http://example.com/about выполняется редирект на https://example.com/about (301), затем новое правило обрабатывает запрос через index.php.
Важно: редирект должен стоять до маршрутизации, иначе запрос уже попадёт на index.php без https.

Этот пример объединяет принудительный HTTPS с маршрутизацией.

Пример 6: Использование mod_rewrite для перенаправления с index.php на чистый URL (удаление index.php)

Пример
RewriteEngine On
RewriteCond %{THE_REQUEST} \s/index\.php[?\s]
RewriteRule ^(.*)index\.php$ /$1 [R=301,L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
При обращении к example.com/index.php/about происходит внешний редирект (301) на example.com/about, после чего второй блок правил передаёт управление index.php.
Это позволяет избавиться от видимого index.php в адресной строке.

Такой приём часто применяется при рефакторинге старых проектов.

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

En
Htaccess index php (php)