Размещение index.php в var/www/html: варианты решений и настройка

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

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

Наиболее эффективное решение: корректная настройка DocumentRoot и DirectoryIndex.

Для того чтобы файл index.php в /var/www/html автоматически обрабатывался как главная страница сайта, необходимо убедиться, что:

  • директива DocumentRoot указывает на /var/www/html;
  • в директиве DirectoryIndex перечислены файлы, среди которых присутствует index.php.

Пример настройки для Apache (файл конфигурации виртуального хоста или /etc/httpd/conf/httpd.conf):


<VirtualHost *:80>
    DocumentRoot /var/www/html
    <Directory /var/www/html>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
    DirectoryIndex index.php index.html
</VirtualHost>
  

Mod rewrite index php (настройка mod_rewrite для index.php)

После изменения конфигурации необходимо перезапустить веб-сервер: sudo systemctl restart httpd (или nginx для Nginx).

Типичные ошибки:

  • Файл index.php отсутствует в /var/www/html - проверьте его наличие командой ls -l /var/www/html/index.php.
  • Неправильные права доступа: chmod 644 /var/www/html/index.php и chown apache:apache /var/www/html/index.php (для Apache).
  • Модуль PHP не установлен или не включен: sudo apt install php libapache2-mod-php (Debian/Ubuntu), sudo yum install php mod_php (CentOS/RHEL).
  • Если используется Nginx, необходима настройка передачи PHP-запросов через FastCGI (см. раздел вариантов).

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

В Apache директива DirectoryIndex по умолчанию включает index.html, но не всегда index.php. Добавление index.php первым элементом решит проблему.


DirectoryIndex index.php index.html
  

Upstream php fpm (настройка upstream для php-fpm в nginx)

Можно также использовать .htaccess в корне сайта:


DirectoryIndex index.php
  

запустить локальный сервер php (запуск локального сервера php)

Проблема: если AllowOverride None, .htaccess не будет обработан. Решение: установить AllowOverride All для каталога в конфигурации виртуального хоста.

Как настроить Nginx для обработки index.php через FastCGI?

Nginx не имеет механизма DirectoryIndex в том же смысле, он использует директиву index внутри блока location.


server {
    listen 80;
    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

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

Php non thread safe (php non-thread-safe (не потокобезопасная версия))

Типичная ошибка: неверный путь к сокету PHP-FPM. Проверить можно командой sudo systemctl status php7.4-fpm (версия может отличаться).

Как изменить корневую папку сайта на другую вместо /var/www/html?

В Apache достаточно изменить DocumentRoot:


DocumentRoot /var/www/mysite
<Directory /var/www/mysite>
    Options Indexes FollowSymLinks
    Require all granted
</Directory>
  

Rewritecond request filename php (правило rewritecond для php в .htaccess)

В Nginx - директива root:


root /var/www/mysite;
  

Apache 2.4 php 8.2 (настройка apache 2.4 с php 8.2)

Не забудьте переместить файлы или создать символическую ссылку. Также проверьте, что PHP-FPM видит новый $document_root.

Что делать, если index.php отображается как текст или скачивается?

Это означает, что PHP не обрабатывается веб-сервером. В Apache проверьте установку mod_php: sudo apt install libapache2-mod-php (для Debian) или sudo yum install mod_php (для RHEL). Затем включите модуль: sudo a2enmod php7.4 (версия по ситуации).

В Nginx убедитесь, что блок location ~ \.php$ активен и FastCGI сервер запущен.

Ошибка: в выводе curl localhost виден исходный код PHP. Решение - проверить конфигурацию на наличие fastcgi_pass и перезагрузить Nginx.

Как использовать символическую ссылку вместо переноса файлов?

Иногда удобно разместить проект в другом каталоге, а в /var/www/html создать ссылку:


ln -s /home/user/myproject /var/www/html/myproject
  

Тогда доступ к http://example.com/myproject/index.php будет работать. Необходимо, чтобы у пользователя веб-сервера (www-data, apache) были права на чтение каталога назначения.

Проблема: если включены FollowSymLinks, но ссылка ведет за пределы разрешенной области (open_basedir в PHP), может возникнуть ошибка доступа.

- веб серверы php (веб-серверы для php)

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

Пример 1. Виртуальные хосты Apache с отдельными index.php

Создание двух сайтов на одном сервере, каждый со своим index.php:

Пример

# /etc/httpd/conf.d/site1.conf
<VirtualHost *:80>
    ServerName site1.local
    DocumentRoot /var/www/site1
    <Directory /var/www/site1>
        DirectoryIndex index.php
        Options Indexes
        Require all granted
    </Directory>
</VirtualHost>

# /etc/httpd/conf.d/site2.conf
<VirtualHost *:80>
    ServerName site2.local
    DocumentRoot /var/www/site2
    <Directory /var/www/site2>
        DirectoryIndex app.php
        Options Indexes
        Require all granted
    </Directory>
</VirtualHost>
  

Результат: при обращении к site1.local загружается /var/www/site1/index.php, а к site2.local - /var/www/site2/app.php.

$ curl http://site1.local
Содержимое index.php из site1

$ curl http://site2.local
Содержимое app.php из site2
  

Пример 2. Использование .htaccess для переопределения DirectoryIndex

Если основной конфигурации нет доступа, можно создать /var/www/html/.htaccess:

Пример

DirectoryIndex home.php
  

Теперь при запросе корня сайта будет загружаться home.php. Убедитесь, что AllowOverride All разрешен.

Возможная ошибка: 500 Internal Server Error при наличии синтаксической ошибки в .htaccess. Проверьте журнал ошибок Apache.

Пример 3. Настройка index.php в Nginx с несколькими location

Дополнительная обработка запросов к статическим файлам:

Пример

server {
    listen 80 default_server;
    root /var/www/html;
    index index.php;

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

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

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

Пример 4. Проверка прав и владельца файла index.php

Команды для диагностики:

Пример

ls -la /var/www/html/index.php
# Пример вывода: -rw-r--r-- 1 apache apache 123 Apr 10 12:00 index.php

# Если владелец неверный:
sudo chown apache:apache /var/www/html/index.php

# Если права недостаточны:
sudo chmod 644 /var/www/html/index.php
# Для Nginx часто используется пользователь nginx:
sudo chown nginx:nginx /var/www/html/index.php
  

Ошибка: 403 Forbidden при правильных правах - возможно, SELinux блокирует доступ. Решение: sudo restorecon -Rv /var/www/html или sudo setsebool -P httpd_read_user_content 1.

Пример 5. Множественные index.php в подпапках с различным содержимым

Структура каталогов:

Пример

/var/www/html/
├── index.php
├── blog/
│   └── index.php
└── shop/
    └── index.php
  

Каждый подкаталог может иметь собственный index.php. Для корректной работы в Apache или Nginx дополнительные настройки не требуются, так как DirectoryIndex действует на каждый каталог.

Результат запросов:

http://example.com/ -> /var/www/html/index.php
http://example.com/blog/ -> /var/www/html/blog/index.php
http://example.com/shop/ -> /var/www/html/shop/index.php
  

Размещение index.php в var/www/html - comments

En
Var www html index php (php)