nginx 404 not found php

I know this has been asked a thousand times, but all of the answers I’m found simply don’t work (for me or usually the original OP of those questions). So, I’ll try to explain the problem as best as I possibly can and hopefully we can get it working for me and for others who have asked before.

My Nginx config (with lots of other irrelevant stuff removed) is as follows:

All I’m trying to do is get Nginx to catch all 404s and send them back to PHP-FPM via location

\.php$ to have a custom error page shown to the user, but I always get the standard Nginx error page.

The following urls should all show the output of mydomain.co.uk/error404.php :

But they actually show the standard Nginx 404 page. If the location

\.php$ returns a different error code to 404 (e.g 5xx) then we don’t want to get involved, just return the content and headers that FastCGI returned in the first place.

I hope that makes sense and that someone can help. Thank you in advance.

EDIT: I have tried adding recursive_error_pages on; to the line after # Custom error pages but this actually causes all Nginx 404 Not Found errors to become Nginx 500 Internal Server Error errors.

EDIT: Adding other files: /etc/nginx/fastcgi.conf

fastcgi_params

I guess I probably don’t need both of these anyway! 😉

5 Answers 5

I’ve finally worked most of it out. Thanks everyone for your tips and putting the time in to write answer.

The issue is that our error404.php was returning our error page with an 404 Not Found header too (using header(‘HTTP/1.0 404 Not Found’); ) and Nginx was then intercepting this error as recursive_error_pages is off (default) and it was showing it’s own 404 page. Switching off fastcgi_intercept_errors is the solution. If we remove the header(‘HTTP/1.0 404 Not Found’); from the error file then we’d get the error but with a 200 which is obviously not what we want.

EDIT: A more full solution:

You need to intercept errors in your main php location block ( fastcgi_intercept_errors is on ) and then have another block for your error pages where you don’t intercept them. See this config example:

This will mean that any of your PHP pages which return an HTTP status code of 404 will have their own content (if any) ignored and the content of your /http_errors/404.php file will be used instead.

Источник

Ошибка 404 not found Nginx

Веб-серверы Nginx и Apache мало похожи друг на друга, и их отличия касаются не только особенностей подключения пользователей, но и обработки URL на сервере. Очень часто новые пользователи Nginx получают ошибку 404 для URL, которые, по сути, должны были бы работать.

Почему возникает ошибка 404 в Nginx

location / <
index index.html index.php;
>
location /favicon.ico <
access_log off;
>
location

* \.(gif|jpg|png)$ <
expires 30d;
>
location

\.php$ <
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name;
include fastcgi_params;
>

Префиксные локейшены всегда начинаются с символа /. Регулярные же содержат символы регулярных выражений:

$ ^ * и так далее. Если пользователь запрашивает favicon.ico, то будет выбран второй location, так как он лучше всего соответствует запросу, при любом другом запросе будет выбран location /, так как он соответствует всем запросам, а других префиксных location у нас нет. Это просто, а дальше начинается магия. После того, как был найден нужный location, Nginx начинает проверять все регулярные выражения в порядке их следования в конфигурационном файле.

Таким образом, любое неверно составленное регулярное выражение в любой части конфигурационного файла может полностью всё сломать. Поэтому разработчики рекомендуют по минимум использовать регулярные выражения. Что касается вложенных location, то обрабатываются они так же как и основные, только уже после передачи управления в нужный location. Путём чтения конфигурационного файла понять, какой location вызывает 404 сложно, поэтому, чтобы исправить ошибку, нам понадобиться режим отладки Nginx.

Как включить режим отладки Nginx?

Сначала нам необходимо установить версию Nginx с поддержкой отладки. Чтобы проверить, поддерживает ли ваша текущая версия этот режим, наберите:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

В выводе должна быть строчка «—with-debug». Если её нет, значит отладка не поддерживается, и надо установить версию с поддержкой. В CentOS такой пакет называется nginx-debug. Для его установки наберите:

sudo yum install nginx-debug

Теперь появился ещё один исполняемый файл, и он собран уже с поддержкой отладки:

Откройте конфигурационный файл вашего сайта или глобальный конфигурационный файл, если вы не задавали настройки логов отдельно для каждого сайта, и в конце стоки error_log замените error на debug:

error_log /var/log/nginx/domains/test.losst.ru.error.log debug

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Останавливаем обычную версию и запускаем версию с отладкой:

systemctl stop nginx
systemctl start nginx-debug

Как исправить «404 Not Found Nginx»?

1. Регулярные выражения

Как я уже сказал выше, самой частой проблемой, которая вызывает 404, являются регулярные выражения. Смотрим, что происходит в лог файле:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Далее директива try_files пытается найти файл /vstats, не находит и ищет index.php, который, в свою очередь, возвращает 404.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Если мы добавим к конфигурационному файлу ещё один location с регулярным выражением, например:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

То абсолютно все запросы будут обрабатываться именно этим регулярным выражением и, естественно, что ничего работать не будет. Видим, что приходит запрос /vstats/:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Он совпадает с префиксным location, но потом Nginx видит наше регулярное выражение и передаёт управление ему.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Поэтому будьте очень осторожны с регулярными выражениями, если они вам нужны, то размещайте их только внутри префиксных location, чтобы ограничить их область действия этим location, иначе может возникнуть ошибка 404 nginx.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

2. Недостаточно памяти

Если php-скрипту не хватило оперативной памяти для выполнения, и его процесс был убит операционной системой, то Nginx тоже может вернуть ошибку 404. Такое поведение вы будете наблюдать, когда скрипт очень долго выполняется, а потом появляется «404 Not Found» или страница ошибки вашего движка. Обычно эта неисправность тоже видна в отладочном логе.

Решить такую проблему можно, освободив память на сервере, часто такое может возникать из-за утечек памяти в php, когда процессы php-fpm занимают почти всю память на сервере. Поэтому перезапуск php-fpm решает проблему:

systemctl restart php-fpm

Чтобы избежать этой проблемы в будущем, можно настроить автоматический перезапуск процессов после обработки определённого количества запросов. Например каждые 200 запросов:

3. Не найден index

Если вы запрашиваете URL вида /vstats/, но в настройках Nginx не указан файл index, который нужно использовать для этой ссылки, то у вас ничего не выйдет, и вы получите 404. Вы можете добавить директиву index в ваш location:

location / <
index index.php index.html index.htm;
>

Или сразу в server, в Nginx все location наследуют директивы, установленные в server.

4. Другие проблемы

Подобных проблем, вызывающих 404 в Nginx, может быть очень много, но все они решаемы, и всё, что нужно для их решения, есть в отладочном логе Nginx. Просто анализируйте лог и на основе этого вносите исправления.

Выводы

В этой статье мы рассмотрели основные причины, из-за которых может возникнуть ошибка 404 not found Nginx. Как видите, может быть много проблем, но всё достаточно просто решается. А с какими проблемами, вызывающими эту ошибку, вы сталкивались? Как их решали? Напишите в комментариях!

Источник

Ошибка 404 not found Nginx

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Веб-серверы Nginx и Apache мало похожи друг на друга, и их отличия касаются не только особенностей подключения пользователей, но и обработки URL на сервере. Очень часто новые пользователи Nginx получают ошибку 404 для URL, которые, по сути, должны были бы работать.

Почему возникает ошибка 404 в Nginx

index index.html index.php;

Префиксные локейшены всегда начинаются с символа /. Регулярные же содержат символы регулярных выражений:

$ ^ * и так далее. Если пользователь запрашивает favicon.ico, то будет выбран второй location, так как он лучше всего соответствует запросу, при любом другом запросе будет выбран location /, так как он соответствует всем запросам, а других префиксных location у нас нет. Это просто, а дальше начинается магия. После того, как был найден нужный location, Nginx начинает проверять все регулярные выражения в порядке их следования в конфигурационном файле.

Таким образом, любое неверно составленное регулярное выражение в любой части конфигурационного файла может полностью всё сломать. Поэтому разработчики рекомендуют по минимум использовать регулярные выражения. Что касается вложенных location, то обрабатываются они так же как и основные, только уже после передачи управления в нужный location. Путём чтения конфигурационного файла понять, какой location вызывает 404 сложно, поэтому, чтобы исправить ошибку, нам понадобиться режим отладки Nginx.

Как включить режим отладки Nginx?

Сначала нам необходимо установить версию Nginx с поддержкой отладки. Чтобы проверить, поддерживает ли ваша текущая версия этот режим, наберите:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

В выводе должна быть строчка «—with-debug». Если её нет, значит отладка не поддерживается, и надо установить версию с поддержкой. В CentOS такой пакет называется nginx-debug. Для его установки наберите:

Теперь появился ещё один исполняемый файл, и он собран уже с поддержкой отладки:

Откройте конфигурационный файл вашего сайта или глобальный конфигурационный файл, если вы не задавали настройки логов отдельно для каждого сайта, и в конце стоки error_log замените error на debug:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Останавливаем обычную версию и запускаем версию с отладкой:

Как исправить «404 Not Found Nginx»?

1. Регулярные выражения

Как я уже сказал выше, самой частой проблемой, которая вызывает 404, являются регулярные выражения. Смотрим, что происходит в лог файле:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Далее директива try_files пытается найти файл /vstats, не находит и ищет index.php, который, в свою очередь, возвращает 404.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Если мы добавим к конфигурационному файлу ещё один location с регулярным выражением, например:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

То абсолютно все запросы будут обрабатываться именно этим регулярным выражением и, естественно, что ничего работать не будет. Видим, что приходит запрос /vstats/:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Он совпадает с префиксным location, но потом Nginx видит наше регулярное выражение и передаёт управление ему.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Поэтому будьте очень осторожны с регулярными выражениями, если они вам нужны, то размещайте их только внутри префиксных location, чтобы ограничить их область действия этим location, иначе может возникнуть ошибка 404 nginx.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

2. Недостаточно памяти

Если php-скрипту не хватило оперативной памяти для выполнения, и его процесс был убит операционной системой, то Nginx тоже может вернуть ошибку 404. Такое поведение вы будете наблюдать, когда скрипт очень долго выполняется, а потом появляется «404 Not Found» или страница ошибки вашего движка. Обычно эта неисправность тоже видна в отладочном логе.

Решить такую проблему можно, освободив память на сервере, часто такое может возникать из-за утечек памяти в php, когда процессы php-fpm занимают почти всю память на сервере. Поэтому перезапуск php-fpm решает проблему:

Чтобы избежать этой проблемы в будущем, можно настроить автоматический перезапуск процессов после обработки определённого количества запросов. Например каждые 200 запросов:

3. Не найден index

Если вы запрашиваете URL вида /vstats/, но в настройках Nginx не указан файл index, который нужно использовать для этой ссылки, то у вас ничего не выйдет, и вы получите 404. Вы можете добавить директиву index в ваш location:

Или сразу в server, в Nginx все location наследуют директивы, установленные в server.

4. Другие проблемы

Подобных проблем, вызывающих 404 в Nginx, может быть очень много, но все они решаемы, и всё, что нужно для их решения, есть в отладочном логе Nginx. Просто анализируйте лог и на основе этого вносите исправления.

Выводы

В этой статье мы рассмотрели основные причины, из-за которых может возникнуть ошибка 404 not found Nginx. Как видите, может быть много проблем, но всё достаточно просто решается. А с какими проблемами, вызывающими эту ошибку, вы сталкивались? Как их решали? Напишите в комментариях!

Источник

404 Not Found

Что такое ошибка 404 Not Found (nginx)

Почему это происходит?

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Как исправить ошибку 404?

В традиционном понимании исправить эту ошибку невозможно, т.к. проблема кроется не в работе сервера или движка сайта, в том, что кто-то неправильно указал адрес ссылки. Поэтому единственным способом исправления можно назвать выявление ошибочных ссылок, и указание правильного адреса. Также стоит проверить существует ли текущая страница на вашем сайте? Если она была удалена, то позаботьтесь о том, чтобы она появилась снова. Если же она была переименована, то нужно настроить 301-редирект со старого адреса страницы на новый.

Совет

Когда пользователь заходит на сайт и видит данную ошибку через выдачу сервера, то он не видит ваш сайт (меню, навигацию, дизайн и т.д.). Соответственно со 100% вероятностью закроет страницу. Такая схема работает на всех хостингах по умолчанию. Но вы можете запрограммировать данную страницу и показать вместе с ней свой сайт. А это значит, что пользователь видя в меню основные ссылки вашего сайта может нажать на них, и остаться на сайте. Вот примеры неправильной и правильной выдачи соответственно:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Соответственно саму страницу «/error404.html» вам нужно будет предварительно создать.

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Провайдеры с виртуальным хостингом

Провайдеры с виртуальным выделенным сервером (VPS)

Провайдеры с выделенным сервером

Юзеры ( 41 ) оценили на 3.8 из 5

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

От панели управления зависит ваше удобство в настройке хостинге\сайта.

Большинство качественных хостингов из нашего ТОПа используют удобные панели управления, поэтому рекомендуем больше внимания уделить другим параметрам при выборе.

Настоятельно рекомендуем не покупать слишком дешевый хостинг! Как правило с ним очень много проблем: сервер иногда не работает, оборудование старое, поддержка долго отвечает или не может решить проблему, сайт хостера глючит, ошибки в регистрации, оплате и т.д.

Также мы собрали тарифы от тысяч хостеров, чтобы вы могли выбрать хостинг по конкретной цене.

На языке программирования PHP и базах данных MySQL сейчас работает большинство сайтов. Они же поддерживаются практически всеми современными хостингами.

Источник

Частые ошибки в настройках Nginx, из-за которых веб-сервер становится уязвимым

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Nginx — это веб-сервер, на котором работает треть всех сайтов в мире. Но если забыть или проигнорировать некоторые ошибки в настройках, можно стать отличной мишенью для злоумышленников. Detectify Crowdsource подготовил список наиболее часто встречающихся ошибок, делающих сайт уязвимым для атак.

Nginx — один из наиболее часто используемых веб-серверов в Интернете, поскольку он модульный, отзывчивый под нагрузкой и может масштабироваться на минимальном железе. Компания Detectify регулярно сканирует Nginx на предмет неправильных настроек и уязвимостей, из-за которых могут пострадать пользователи. Найденные уязвимости потом внедряются в качестве теста безопасности в сканер веб-приложений.

Мы проанализировали почти 50 000 уникальных файлов конфигурации Nginx, загруженных с GitHub с помощью Google BigQuery. С помощью собранных данных удалось выяснить, какие ошибки в конфигурациях встречаются чаще всего. Эта статья прольёт свет на следующие неправильные настройки Nginx:

Отсутствует корневой каталог

Небезопасное использование переменных

Чтение необработанного ответа сервера

Отсутствует корневой каталог

Из почти 50 000 файлов конфигурации Nginx, которые мы проанализировали, наиболее распространёнными корневыми путями были следующие:

nginx 404 not found php. Смотреть фото nginx 404 not found php. Смотреть картинку nginx 404 not found php. Картинка про nginx 404 not found php. Фото nginx 404 not found php

Потерявшийся слеш

Одним из признаков того, что сервер Nginx имеет неправильную конфигурацию, является возврат сервером одинакового же ответа при удалении косой черты в URL-адресе. То есть, если http://server/api/user и http://server/apiuser возвращают один и тот же ответ, сервер может быть уязвимым. Он позволяет отправлять следующие запросы:

Небезопасное использование переменных

Некоторые фреймворки, скрипты и конфигурации Nginx небезопасно используют переменные, хранящиеся в Nginx. Это может привести к таким проблемам, как XSS, обход HttpOnly-защиты, раскрытие информации и в некоторых случаях даже RCE.

SCRIPT_NAME

С такой конфигурацией, как эта:

XSS возможен, если PHP-скрипт попытается определить базовый URL на основе SCRIPT_NAME ;

Пример уязвимой конфигурации Nginx:

Произвольные переменные

В некоторых случаях данные, предоставленные пользователем, можно рассматривать как переменную Nginx. Непонятно, почему это происходит, но это встречается не так уж редко, а проверяется довольно-таки сложным путём, как видно из этого отчёта. Если мы поищем сообщение об ошибке, то увидим, что оно находится в модуле фильтра SSI, то есть это связано с SSI.

Одним из способов проверки является установка значения заголовка referer:

Мы просканировали эту неправильную конфигурацию и обнаружили несколько случаев, когда пользователь мог получить значение переменных Nginx. Количество обнаруженных уязвимых экземпляров уменьшилось, что может указывать на то, что уязвимость исправлена.

Чтение необработанного ответа сервера

С proxy_pass Nginx есть возможность перехватывать ошибки и заголовки HTTP, созданные бэкендом (серверной частью). Это очень полезно, если вы хотите скрыть внутренние сообщения об ошибках и заголовки, чтобы они обрабатывались Nginx. Nginx автоматически предоставит страницу пользовательской ошибки, если серверная часть ответит ей. А что происходит, когда Nginx не понимает, что это HTTP-ответ?

Если клиент отправляет недопустимый HTTP-запрос в Nginx, этот запрос будет перенаправлен на серверную часть как есть, и она ответит своим необработанным содержимым. Тогда Nginx не распознает недопустимый HTTP-ответ и просто отправит его клиенту. Представьте себе приложение uWSGI, подобное этому:

И со следующими директивами в Nginx:

proxy_intercept_errors будет обслуживать пользовательский ответ, если бэкенд имеет код ответа больше 300. В нашем приложении uWSGI выше мы отправим ошибку 500, которая будет перехвачена Nginx.

proxy_hide_header почти не требует пояснений; он скроет любой указанный HTTP-заголовок от клиента.

Если мы отправим обычный GET-запрос, Nginx вернёт:

Но если мы отправим неверный HTTP-запрос, например:

То получим такой ответ:

merge_slashes отключены

Мы нашли 33 Nginx-файла, в которых для параметра merge_slashes установлено значение «off».

Попробуйте сами

Мы создали репозиторий GitHub, где вы можете использовать Docker для настройки своего собственного уязвимого тестового сервера Nginx с некоторыми ошибками конфигурации, обсуждаемыми в этой статье, и попробуйте найти их самостоятельно!

Вывод

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

Вторая часть будет позднее.

Что ещё интересного есть в блоге Cloud4Y

Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью. Пишем не чаще двух раз в неделю и только по делу.

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *