Собираете статику в root, а для HTML5 History API используете try_files $uri $uri/ /index.html;, чтобы глубокие пути отдавали index.html, а ассеты — реальные файлы.
Разбор
- API location (
/api) должен идти отдельно в upstream, не в SPA fallback.
- Кэшируйте hashed assets агрессивно,
index.html — коротко или no-cache.
- Проверьте
base href и пути ассетов.
- Ошибка: весь трафик в index.html ломает API и SEO файлы.
Итог
SPA fallback = try_files на index.html + отдельный /api.