Nginx + PHP index.php не найден 404

Вопрос или проблема

Я использую Debian 9 с nginx 12 и php7.1

Я всё настроил.
Nginx не выдаёт ничего в журнал ошибок, все PHP-скрипты работают на 100%. Nginx индексирует index.html как индекс, но НЕ находит index.php и возвращает 404, хотя я это настроил в конфигурации nginx.

Вот моя конфигурация nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    # Конфигурация SSL
    #
    # listen 443 ssl default_server;
    # listen [::]:443 ssl default_server;
    #
    # Примечание: вы должны отключить gzip для SSL-трафика.
    # См.: https://bugs.debian.org/773332
    #
    # Ознакомьтесь с ssl_ciphers, чтобы обеспечить безопасную конфигурацию.
    # См.: https://bugs.debian.org/765782
    #
    # Самоподписанные сертификаты, сгенерированные пакетом ssl-cert
    # Не используйте их на производственном сервере!
    #
    # include snippets/snakeoil.conf;

    root /var/www/html;

    # Добавьте index.php в список, если вы используете PHP
    index index.php index.html index.htm;

    server_name _;
    server_tokens off;

    location / {
            # Сначала попытка обслужить запрос как файл, затем
            # как каталог, затем вернуться к отображению 404.
            try_files $uri /index.html index.php;
    }

    # передачи PHP скриптов на сервер FastCGI
    #

    location ~ \.php$ {

            # С php-fpm (или другие unix-сокеты):
            try_files $uri =404;
            include fastcgi.conf;
            fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
            fastcgi_index index.php;
    }

    # запрет доступа к .htaccess файлам, если корень документа Apache
    # совпадает с nginx
    #
    #location ~ /\.ht {
    #       deny all;
    #}}

Всё хорошо, я разобрался 🙂
Это была ошибка в моей конфигурации:

 location / {
            # Сначала попытка обслужить запрос как файл, затем
            # как каталог, затем вернуться к отображению 404.
            try_files $uri /index.html index.php;
    }

Ответ или решение

Проблема с ошибкой 404, возникающая при попытке доступа к файлу index.php на сервере с Nginx и PHP, часто вызывает затруднения у администраторов. В вашем случае, вы работали с конфигурацией Nginx на Debian 9 с PHP 7.1 и столкнулись с тем, что Nginx не смог найти файл index.php, хотя все PHP-скрипты функционировали корректно. Давайте рассмотрим, в чем могла заключаться ошибка и как её решить.

Анализ конфигурации Nginx

Ваша конфигурация сервера включает следующие ключевые элементы:

  1. Параметры root и index:

    root /var/www/html;
    index index.php index.html index.htm;

    Эти строки означают, что корневой каталог вашего веб-приложения установлен на /var/www/html, а в качестве индексных файлов указаны index.php, index.html и index.htm.

  2. Location блок для корневого адреса:

    location / {
       try_files $uri /index.html index.php;
    }

    Эта часть вашей конфигурации отвечает за обработку запросов к корню вашего сайта. При этом try_files пытается сначала предоставить запрашиваемый URI, затем обращается к файлу index.html, а затем — к index.php.

Проблема в конфигурации

Вы нашли ошибку в данной конфигурации, и это, безусловно, решило вашу проблему. Важно отметить, что порядок следования в директиве try_files имеет большое значение.

Когда запрос к файлу index.php вызывает 404, это может происходить из-за того, что сервер не может найти файл в первой попытке, и, таким образом, он переходит к следующему уровню, в данном случае к index.html, вместо того чтобы обратиться к index.php. Порядок на самом деле следовал бы такой:

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

Таким образом, это говорит системе сначала проверять существование URI, затем проверять наличие папки с таким именем, и, если ничего не найдено, обращаться к index.php.

Предложение по улучшению

Для более корректной работы вашего сервера вы также могли бы добавить блок location для обработки запросов к index.php, как это сделано в вашем случае:

location ~ \.php$ {
    try_files $uri =404;
    include fastcgi.conf;
    fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
    fastcgi_index index.php;
}

Убедитесь, что ваша конфигурация FastCGI настроена правильно, а путь к сокету соответствует реальному расположению вашего PHP-FPM.

Заключение

Теперь после исправления вашей конфигурации Nginx приложения должны корректно обрабатывать запросы к index.php, и ошибка 404 не будет более возникать. Не забывайте проверять логи сервера для получения дополнительной информации при возникновении проблем, и всегда устанавливайте порядок в правах доступа и конфигурациях, чтобы избежать путаницы.

Если у вас возникнут дополнительные вопросы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...