NGINX не отображает страницу index.php, все остальные страницы работают.

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

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

Что я пытаюсь добиться:

  1. example.com перенаправляется на www.example.com
  2. www.example.com/index перенаправляется на www.example.com/
  3. www.example.com/page.php перенаправляется на www.example.com/page (без .php)
  4. www.example.com/resources должен работать, если у меня есть такая же папка и имя файла
  5. www.example.com/sdfgdsgdfsgjdf показывает 404.html, потому что файл не существует
  6. Параметры в URL работают, например ?lang=en&test=test
  7. www.example.com// должен иметь отключенный двойной слэш

В настоящее время этот код работает, кроме пункта 5. Каждая несуществующая страница показывает страницу индекса.

Я почти исправил все вышеперечисленное, заменив try_files $uri /index.php$is_args$args; на try_files $fastcgi_script_name =404;, но тогда страница www.example.com не работает, только www.example.com/index работает

server {
    listen 80;
        server_name example.com;
        return 301 https://www.example.com/$request_uri;
}

server {
        listen 80;
    server_name www.example.com;

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

        error_page 404 /404.html;
        error_page 500 502 503 504 /404.html;

        location / {
        try_files $uri $uri.html @extensionless-php;
    }

        location ~ \.php$ {
        try_files $uri /index.php$is_args$args;

        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        fastcgi_send_timeout 180s;
        fastcgi_read_timeout 180s;
        }

    location @extensionless-php {
            rewrite ^(.*)$ $1.php last;
    }

    location = /404.html {
        internal;
    }
}

server {
    listen 80 default_server;
    server_name _;

    root /var/www/html/health-check;

    location / {
        index index.php index.html index.htm;

        try_files $uri $uri.html =404;
    }
}

Пока я пробовал множество попыток исправить это в разном порядке:

    # rewrite ^/$ /index;
    # rewrite ^/(.*)/$ /$1 permanent;
    # rewrite ^(.+)/+$ $1 permanent;
    # rewrite ^(.+)/index.html$ $1 permanent;
    # rewrite ^/$ /index;

    # Ошибка слишком многих перенаправлений
    # location = /index.php {
    # return 301 /;
    # }

    # try_files $uri /index.php;
    # try_files $uri =404;
    # try_files $uri /index.php?$args;
    # try_files $uri /index.php?$args =404;
    # try_files $uri $uri/ @extensionless-php;
    # try_files $uri $uri.html @extensionless-php;
    # try_files $uri $uri/ /index.php?$args @extensionless-php;

    # Ломает папки и одинаковые имена файлов
    # try_files $uri $uri/ /index.php$is_args$args;

    # Показывает 404 на странице индекса, когда ? в URL
    # try_files $uri /index.php$is_args$args =404;

    # Все работает, кроме индекса
    # try_files $fastcgi_script_name =404;

    # Ломает URL
    # fastcgi_param PATH_INFO $fastcgi_path_info;

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

Решение проблемы с отображением страницы index.php в NGINX

Проблема с тем, что страница index.php не отображается должным образом, может вызывать не только неудобства, но и негативно сказываться на пользовательском опыте и SEO вашего веб-сайта. В данной статье мы рассмотрим настройки NGINX и предоставим решение вашей проблемы, основываясь на описанных вами требованиях.

Контекст проблемы

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

Основные шаги для решения проблемы:

  1. Правильные настройки редиректов.
  2. Устранение некорректной обработки 404 ошибок.
  3. Проверка правильной работы PHP.

Рекомендованная конфигурация NGINX

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

server {
    listen 80;
    server_name example.com;
    return 301 https://www.example.com$request_uri;
}

server {
    listen 80;
    server_name www.example.com;

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

    error_page 404 /404.html;
    error_page 500 502 503 504 /404.html;

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

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

        try_files $uri =404;  # Если файл не найден, возвращаем 404
    }

    location @extensionless-php {
        rewrite ^/(.*)$ /$1.php last;
    }

    location = /404.html {
        internal;
    }
}

server {
    listen 80 default_server;
    server_name _;
    root /var/www/html/health-check;

    location / {
        try_files $uri =404;
    }
}

Подробный анализ изменений:

  1. Порядок обработки файлов:

    • В блоке location / добавлен редирект к index.php, если файл или директорий не найден. Это позволит корректно обрабатывать основные запросы к вашему сайту.
    • Убрано использование @extensionless-php для основной конфигурации, так как это может привести к нежелательным результатам, если запрашивается несуществующий файл.
  2. Корректная обработка ошибок:

    • В конфигурации для обработки PHP добавлена строчка try_files $uri =404;. Это обеспечит возврат ошибки 404, когда запрашиваемый файл не существует, вместо перенаправления на index.php.
  3. PHP обработчик:

    • Используется директива include snippets/fastcgi-php.conf; для упрощения конфигурации PHP. Убедитесь, что у вас есть соответствующий файл, который настраивает параметры FastCGI. В большинстве случаев, он уже настроен и включает нужные параметры.

Проверка работоспособности изменений

После внесения изменений в конфигурацию NGINX, выполните следующие шаги:

  1. Проверьте корректность конфигурации:

    sudo nginx -t
  2. Перезапустите NGINX:

    sudo systemctl restart nginx
  3. Тестируйте все сценарии:

    • Перейдите на www.example.com, должен отображаться index.php.
    • Перейдите на www.example.com/page.php, он должен перенаправить на www.example.com/page.
    • Попробуйте зайти на несуществующие страницы и убедитесь, что вы получаете 404.html.

Заключение

Следуя представленной конфигурации, вы должны получить функциональный сайт, удовлетворяющий всем вашим требованиям. Корректная обработка запросов и ошибок поможет улучшить пользовательский опыт и повысить SEO вашего веб-приложения. Не забывайте тестировать каждое изменение и сохранять резервные копии вашей конфигурации перед её изменением.

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

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