Почему Nginx не всегда регистрирует ошибки 404 в логах?

Привет! У меня есть вопрос по поводу работы nginx. 

При обращении по https к несуществующему файлу в access.log отображается стандартная 404-я ошибка, как показано в следующем примере: 
<pre><code>176.111.75.7 - - [14/Dec/2024:22:08:07 +0300] "GET /durdom.php HTTP/1.1" 404 187 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"</code></pre>

Однако, если я обращаюсь по http, происходит 301-й редирект на https (это прописано в конфигурации nginx), и затем также возникает 404-я ошибка:
<pre><code>176.111.75.7 - - [14/Dec/2024:22:09:25 +0300] "GET /durdom.php HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
176.111.75.7 - - [14/Dec/2024:22:09:25 +0300] "GET /durdom.php HTTP/1.1" 404 187 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"</code></pre>

Тем не менее, я заметил, что в access.log часто фиксируются многотысячные попытки ботов обратиться к различным файлам, и при этом не возникает ошибок 404. Вместо этого, в логах записывается только 301-я ошибка. Вот фрагмент таких записей:
<pre><code>150.136.112.62 - - [14/Dec/2024:14:21:11 +0300] "GET /dropdown.php HTTP/1.1" 301 169 "-" "-"
150.136.112.62 - - [14/Dec/2024:14:21:12 +0300] "GET /dropdown.php HTTP/1.1" 301 169 "-" "-"
150.136.112.62 - - [14/Dec/2024:14:21:12 +0300] "GET /about.php HTTP/1.1" 301 169 "-" "-"
150.136.112.62 - - [14/Dec/2024:14:21:12 +0300] "GET /about.php HTTP/1.1" 301 169 "-" "-"
150.136.112.62 - - [14/Dec/2024:14:21:13 +0300] "GET /admin.php HTTP/1.1" 301 169 "-" "-"
150.136.112.62 - - [14/Dec/2024:14:21:13 +0300] "GET /admin.php HTTP/1.1" 301</code></pre>

Почему возникают 301 ошибки вместо 404 в этих случаях?
  • 14 декабря 2024 г. 19:23
Ответы на вопрос 2
Проблема, с которой вы столкнулись, связана с поведением Nginx при обработке переадресаций (редиректов) и ошибок. Давайте разберемся подробнее.

### Как работает редирект в Nginx

Когда вы настраиваете Nginx для выполнения редиректа с HTTP на HTTPS, это обычно делается с использованием директивы `rewrite` или блоков `server`, которые получают запросы на порт 80 (HTTP) и возвращают ответ с кодом 301 (постоянный редирект) на соответствующий URL на порт 443 (HTTPS).

### Почему вы видите только 301 ошибки

1. **Поведение с редиректом:** Когда бот или пользователь пытается получить доступ к несуществующему ресурсу через HTTP, Nginx обрабатывает этот запрос и выполняет 301 редирект на соответствующий URL на HTTPS. Этот редирект будет зафиксирован в логах как 301.

2. **Нет прямого доступа к 404:** Если после редиректа на HTTPS тот же самый запрос (URL) все еще не существует, то Nginx сначала регистрирует 301 на HTTP, а потом редиректит на HTTPS и возвращает 404 на новом URL. Однако, если запрос происходит слишком быстро (например, от ботов), то вы можете не увидеть запись 404 для HTTPS, так как Nginx может либо не записывать ее, либо вы не настраиваете логгирование ошибок корректно.

3. **Настройки логирования:** Возможно, настройки для логирования в вашем конфигурационном файле Nginx отличаются для 404 и 301 статусов. Например, вы можете учитывать только определенные статусы в доступных логах.

4. **Кэширование:** Если у вас настроено кэширование или прокси (например, с использованием `proxy_cache`), это может также влиять на результаты, и ошибки 404 могут игнорироваться или регистрация их может временно замедляться.

### Рекомендации

- **Проверьте конфигурацию:** Просмотрите конфигурацию Nginx на предмет записей логов. Убедитесь, что вы регистрируете как `access_log`, так и `error_log` для всех нужных вам статусов.

- **Убедитесь, что редирект работает корректно:** Проверьте, что редирект HTTP на HTTPS полностью выполняется и что 404 ошибки верно регистрируются.

- **Анализируйте поведение ботов:** Если боты отправляют запросы слишком быстро или они повторяют запросы слишком часто без ожидаемой некоторые временные промежутки, это также может привести к отсутствию соответствующих записей. Вы можете использовать механизмы ограничения частоты (rate limiting), чтобы избежать этого.

Пока у вас зафиксированы только 301 ошибки от ботов на 404 ошибок, то вам следует внимательно следить и анализировать логи и конфигурацию для выявления причин такого поведения.
Редирект отрабатывает Web-client ( browser, curl, wget) 
Но если используется своя реализация, то могут и не отрабатывать. (если куда-то послали, не обязательно туда идти).
Вы это можете реализовать через telnet/netcat вручную сформирован http запрос.
Похожие вопросы