Файл возврата с кодом состояния с удаленного сервера в 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 и т. Д., Но ничего, что подходило бы к моему случаю, так как кажется, что большинство примеров используют очень упрощенную пересылку.

Как я могу добиться такого поведения?

0
задан 21 May 2020 в 12:53
1 ответ

Мне удалось решить эту проблему, заставив мой серверный API всегда отвечать индексом.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 и последует за перенаправлениями.

0
ответ дан 22 May 2020 в 19:29

Теги

Похожие вопросы