Я пытаюсь настроить свой SPA так, чтобы он возвращал 404 для недопустимых ресурсов, заставляя nginx выполнять обратную проверку ресурса перед ответом. Все это сделано для того, чтобы избежать появления недействительных страниц с 200 и, таким образом, заставить пауков сканировать мягкие страницы 404.
Мое желаемое поведение
Browser Nginx API
| -- GET myapp.com/users/12 --> | |
| | -- GET myapi:8000/users/12 |
| | <----------- 404 -------- |
| <-- 404 index.html ------------ |
| |
Я ожидаю, что моя конфигурация будет примерно такой, как показано ниже
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location /users/ {
# 1. Fetch from myapi:8000
# 2. Return index.html with status from fetched URI
}
}
Я уже некоторое время копаюсь, но я немного не понимаю, как этого добиться. Я видел много простых примеров с try_files
и т. д., но ничего, что подходило бы к моему случаю, поскольку кажется, что в большинстве примеров пересылка выполняется очень упрощенно.
Как я могу добиться такого поведения?
Мне удалось решить эту проблему, заставив мой серверный API всегда отвечать index.html для Accept: text/html
. Я пробовал использовать Lua с OpenResty, но он казался слишком хакерским, причудливым и слишком сложным для обслуживания.
Тогда моя конфигурация выглядит так:
location / {
try_files $uri $uri/ @forward_to_api;
}
location @forward_to_api {
rewrite ^(.*) /api$1 break;
proxy_set_header "Accept" "text/html";
proxy_pass http://localhost:8000;
# Follow any redirects
proxy_intercept_errors on;
error_page 301 302 307 = @follow_redirect;
}
location @follow_redirect {
set $moved_location $upstream_http_location;
proxy_pass http://localhost:8000$moved_location;
}
Это перенаправит все $ uri на localhost:8000/api/$uri
и следуйте перенаправлениям.