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

nginx - изменить error_page на основе ответа proxy_pass

Можно ли изменить резервную страницу error_page на основе ответа вышестоящего прокси?

upstream serverA {
  server servera.com;
}

upstream serverB {
  server serverb.com;
}

location / {
  proxy_set_header X-Real-IP       $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for
  proxy_set_header Host            $host;
  proxy_pass http://serverA;
  proxy_intercept_errors on;

  # if serverA returns 'hard' 404
  # IE returns X-HARD-404=true header
    return 404;
  # else I would like to fallback to server-b
    error_page 403 404 500 502 504 = @serverB;
}

Причина, по которой я хотел бы сделать это, - проблема с нашей настройкой. Обычно мы отправляем запрос на server-a, и если он возвращает 404, мы просим server-b вернуть страницу. В этом случае мы не хотим, чтобы server-b возвращал свою страницу, и мы хотим явно вернуть 404, не пытаясь server-b.

Вы также можете обслуживать страницу с ошибкой прямо из nginx.

Если serverA дает 404, отправьте 404.html из / your / nginx / html / directory / без участия serverB

server {
    listen 80;

    location / {
        proxy_pass http://serverA/;
        proxy_intercept_errors on;
        proxy_redirect off;
        error_page 404 /404.html;
    }

    location /404.html {
      root /your/nginx/html/directory/;
    }
}

Вы можете попробовать это:

location / {
    ...
    error_page 404 = @check_header;
    error_page 403 500 502 504 = @serverB;
}

location @check_header {
    if ($upstream_http_x_hard_404) {
        return 404;
    }
    return 403;
    error_page 403 = @serverB;
}