Назад | Перейти на главную страницу

Вернуть файл с кодом состояния с удаленного сервера в Nginx

Я пытаюсь настроить свой 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 и следуйте перенаправлениям.