文件上传太大时,NGINX重定向到413

时间:2019-03-25 11:18:30

标签: nginx redirect nginx-reverse-proxy http-error

例如example.com,我们即将推出一个新网站。 Example.com受Cloudflare(免费)保护。这意味着上传限制为100mb。但是,我们需要能够上传更大的视频。因此,为了实现这一目标,我们使用了一个将视频发布到的子域(视频。

该设置是一个Rails应用程序(@app),其前面有一个Nginx反向代理。

现在,当视频上传超过300MB时,我们要显示错误页面。该错误页面由Rails应用程序托管在/ 413上。但是,无论我怎么做,当达到300MB的限制时,似乎都无法让NGINX重定向到/ 413。

我在不同的地方尝试了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;
}

0 个答案:

没有答案