Nginx Error 404: open() failed (No such file or directory) — Решение
Клиент запрашивает статический ресурс или роут одностраничного приложения (SPA), но получает ответ 404 Not Found. В журнале ошибок error.log регистрируется: open() "/var/www/html/static/app.js" failed (2: No such file or directory), client: ..., request: "GET /static/app.js HTTP/1.1".
| Конфигурация Nginx | Запрашиваемый URI | Результирующий путь на диске |
|---|---|---|
root /var/www/html; в location /static/ | /static/app.js | /var/www/html/static/app.js (путь конкатенируется) |
alias /var/www/static/; в location /static/ | /static/app.js | /var/www/static/app.js (префикс заменяется) |
SPA без try_files | /dashboard/users | Nginx ищет физическую папку /dashboard/users |
- Файл отсутствует на диске или путь к нему сформирован веб-сервером неверно из-за путаницы
rootиalias. - При перезагрузке страницы в React/Vue/Angular приложении отдается 404 ошибка.
- Сопоставьте путь из лога ошибки с реальным расположением файлов на сервере:
# Посмотрите путь, на который ругается Nginx в error.log, и проверьте диск: ls -la /var/www/html/static/app.js - Поймите фундаментальную разницу между
rootиalias:
• Приroot /data;путь вычисляется какroot + location + URI.
• Приalias /data/;часть URI, совпавшая сlocation, полностью заменяется на путь alias.# ПРАВИЛЬНОЕ ИСПОЛЬЗОВАНИЕ ALIAS: location /static/ { alias /var/www/assets/; # Обязателен закрывающий слэш на конце! } - Для одностраничных приложений (SPA) настройте перенаправление всех роутов на
index.htmlчерез директивуtry_files:location / { root /var/www/my-spa-build; index index.html; try_files $uri $uri/ /index.html; } - Проверьте регистр символов в именах файлов: Linux чувствителен к регистру (
File.jpg!=file.jpg). - Проверьте конфигурацию:
sudo nginx -t && sudo systemctl reload nginx.
alias внутри location с регулярными выражениями или без закрывающего слэша возникает трудноуловимый баг дублирования путей. Всегда проверяйте финальный путь в /var/log/nginx/error.log.Частые вопросы (FAQ)
Почему при обновлении страницы в React/Vue выдается 404?
Потому что роутинг SPA происходит на клиенте через JS History API. Когда браузер напрямую запрашивает URL /profile, Nginx пытается найти файл /profile на диске. Директива try_files $uri $uri/ /index.html решает эту проблему.
Что означает директива try_files $uri $uri/ =404?
Nginx сначала проверяет существование точного файла ($uri), затем директории с таким именем ($uri/), и если ничего не найдено, возвращает ошибку 404.
Как отключить логирование 404 ошибок для favicon.ico и robots.txt?
Добавьте: location = /favicon.ico { log_not_found off; access_log off; }.
В чем опасность бага Alias Traversal (Off-by-slash)?
Если указать 'location /files { alias /var/www/files/; }' (без слэша после files), запрос /files.. скомпрометирует родительскую директорию /var/www/.