NGINX перенаправить на 413, когда загрузка файла слишком велика - PullRequest
0 голосов
/ 25 марта 2019

Мы скоро запустим новый веб-сайт, скажем, example.com. Example.com защищен Cloudflare (бесплатно). Что означает ограничение в 100 Мб на загрузку. Однако мы должны иметь возможность загружать видео большего размера. Поэтому для достижения этого мы используем поддомен, на который мы размещаем видео (видео.

Установка представляет собой приложение Rails (@app) с обратным прокси-сервером Nginx перед ним.

Теперь мы хотим показать страницу с ошибкой, когда загрузка видео превышает 300 МБ. Эта страница с ошибкой размещается в / 413 приложением Rails. Но независимо от того, что я пытаюсь сделать, я не могу заставить NGINX перенаправить в / 413, когда достигнут предел в 300 МБ.

Я пробовал разные комбинации recursive_error_pages on; и proxy_intercept_errors on; в разных местах, но, похоже, я не могу понять это правильно. Он запускает 413, но не перенаправляет.

Моя конфигурация Nginx выглядит следующим образом:

upstream app {
  # Path to Puma SOCK file, as defined previously
  server unix://rails/www/sockets/puma.sock fail_timeout=0;
}

server {
  listen 0.0.0.0:80;
  server_name example.com localhost;
  root /rails/www/public;

  client_body_in_file_only clean;
  client_body_buffer_size 32K;
  client_max_body_size 100M;
  keepalive_timeout 10;
  try_files $uri/index.html $uri @app;

  recursive_error_pages on;
  error_page 413 /413;

  location @app {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    error_page 413 /413;
    recursive_error_pages on;
  }

  sendfile on;
  send_timeout 300s;
}


server {
  listen 0.0.0.0:80;
  server_name videos.example.com;
  root /rails/www/public;

  client_body_in_file_only clean;
  client_body_buffer_size 32K;
  client_max_body_size 300M;
  keepalive_timeout 600;
  try_files $uri/index.html $uri;

  recursive_error_pages on;
  error_page 413 /413;

  location /cms/vlogs {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    error_page 413 /413;
    recursive_error_pages on;
  }

  location /vlogs {
    proxy_pass http://app;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_connect_timeout       600;
    proxy_send_timeout          600;
    proxy_read_timeout          600;
    error_page 413 /413;
    recursive_error_pages on;
  }

  location = /413 {
    return 301 https://example.com/413
  }

  sendfile on;
  send_timeout 600s;
}
...