Перенаправление запросов к index.php: серверные настройки

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

Настройка перенаправлений для index.php на сервере

Основное эффективное решение для Apache с mod_rewrite

Для серверов Apache наиболее распространённый метод скрытия index.php использует файл .htaccess с модулем mod_rewrite. Правило перенаправляет все запросы, которые не указывают на реально существующие файлы или директории, на index.php.


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

Rewrite index php (настройка перенаправлений (rewrite) для index.php)

Пояснение:

  • RewriteEngine On - включает механизм реврайта.
  • RewriteCond - проверяет, что запрошенный путь не является существующим файлом (!-f) и не является существующей директорией (!-d).
  • RewriteRule - перенаправляет любой запрос (^(.*)$) на index.php, добавляя строку запроса (QSA) и завершая обработку правил (L).

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

  • Ошибка 500 - модуль mod_rewrite не включен. Решение: выполнить a2enmod rewrite и перезагрузить Apache.
  • Правило не работает - директива AllowOverride не разрешает .htaccess. Проверьте настройки виртуального хоста: AllowOverride All.
  • Зацикливание - если index.php тоже подпадает под RewriteCond, но условие !-f должно исключать его. Если проблема остаётся, добавьте дополнительную проверку: RewriteCond %{REQUEST_URI} !^/index\.php.
  • Не работает после перемещения сайта - проверьте путь к index.php (может быть в подпапке). Например: RewriteRule ^(.*)$ subfolder/index.php [QSA,L].

Как настроить реврайт для Nginx?

Для Nginx реврайт реализуется через директиву try_files в блоке server или location.


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

программы php сервер (программы для php сервера)

Объяснение: Nginx сначала пытается отдать статический файл по запрошенному URI. Если файла нет, пытается отдать директорию. В противном случае внутренний редирект на /index.php с передачей строки запроса.

Возможные проблемы:

  • Не настроен блок обработки PHP - после реврайта запрос должен обрабатываться через FastCGI для .php файлов. Убедитесь, что присутствует location ~ \.php$ с нужными параметрами.
  • Ошибка 404 - корень root указывает не на ту папку, где лежит index.php.

Как настроить реврайт для IIS?

В IIS используется модуль URL Rewrite. Правило задаётся в файле web.config.


<rule name="Hide index.php" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
    </conditions>
    <action type="Rewrite" url="index.php/{R:1}" />
</rule>
  

подключить php к сайту (подключение php к сайту)

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

Частые ошибки:

  • Модуль URL Rewrite не установлен. Установить через Web Platform Installer или вручную.
  • Некорректный синтаксис web.config - проверьте регистр тегов и кавычки.
  • После реврайта запрос уходит на index.php, но PHP не обрабатывается - настройте FastCGI или модуль обработки PHP.

Как обойтись без реврайта на уровне веб-сервера?

Если нет доступа к настройкам сервера, можно использовать обработчик ошибок 404. В .htaccess указывается:


ErrorDocument 404 /index.php
  

Этот метод менее гибкий: не передаётся оригинальный URI, и все запросы, включая настоящие 404, будут перенаправлены на index.php. Применяется только как временное решение.

Проблема:

В index.php необходимо анализировать переменную $_SERVER['REQUEST_URI'] для восстановления пути, так как в $_SERVER['REDIRECT_URL'] может оказаться неполная информация. Кроме того, не все веб-серверы поддерживают такой подход.

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

Пример 1: Apache .htaccess с дополнительными флагами

Чтобы избежать проблем с кешированием и правильно передавать параметры, используют флаги QSA (Query String Append) и L (Last). Также можно добавить проверку на пропуск index.php в цикле.

Пример

RewriteEngine On
# Исключаем сам index.php из реврайта (чтобы избежать цикла)
RewriteCond %{REQUEST_URI} !^/index\.php
# Исключаем существующие файлы и директории
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Перенаправляем, сохраняя строку запроса
RewriteRule ^(.*)$ index.php/$1 [QSA,L]

Результат работы (команда curl):

$ curl -I http://example.com/about?page=2
HTTP/1.1 200 OK
...
# Внутри index.php: $_SERVER['REQUEST_URI'] = '/about?page=2'

Без флага L правило может обрабатываться дальше, вызывая непредвиденные реврайты.

Пример 2: Nginx с использованием регулярного выражения для исключений

Иногда требуется запретить реврайт для определённых путей, например, для папки /static.

Пример

server {
    listen 80;
    server_name example.com;
    root /var/www/example/public;
    index index.php;

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

    # Исключаем статические ресурсы
    location ~* \.(css|js|jpg|jpeg|png|gif|ico)$ {
        expires 30d;
        access_log off;
    }

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

Результат запроса к /css/style.css:

$ curl -I http://example.com/css/style.css
HTTP/1.1 200 OK
Content-Type: text/css
...

Запрос к /about будет передан index.php.

Пример 3: IIS с перенаправлением с сохранением подстроки

Правило ниже извлекает всю строку запроса и передаёт её как параметр PATH_INFO.

Пример

<rule name="IndexRewrite" stopProcessing="true">
    <match url="(.*)" />
    <conditions logicalGrouping="MatchAll">
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        <add input="{REQUEST_URI}" pattern="^/index\.php" negate="true" />
    </conditions>
    <action type="Rewrite" url="/index.php/{R:1}" appendQueryString="true" />
</rule>

Дополнительное условие исключает прямой запрос к index.php. AppendQueryString аналогичен флагу QSA.

Пример 4: PHP Fallback (только для разработки)

Для встроенного PHP-сервера можно использовать роутер:

Пример

// router.php
$uri = $_SERVER['REQUEST_URI'];
if (preg_match('/\.(?:png|jpg|jpeg|gif|css|js)$/', $uri) && file_exists(__DIR__ . $uri)) {
    return false;
}
$_SERVER['SCRIPT_NAME'] = '/index.php';
require __DIR__ . '/index.php';

Запуск сервера: php -S localhost:8000 router.php

Результат: запросы к существующим статическим файлам обрабатываются напрямую, остальные - через index.php.

# В браузере http://localhost:8000/about отображается результат работы index.php

Настройка перенаправлений (rewrite) для index.php - comments

En
Rewrite index php (php)