nginx没有提供我的error_page

Fra*_*eil 41 nginx custom-error-pages

我有一个用Unicorn托管的Sinatra应用程序,在它前面有nginx.当Sinatra应用程序出错(返回500)时,我想提供一个静态页面,而不是默认的"内部服务器错误".我有以下nginx配置:

server {
  listen 80 default;
  server_name *.example.com;
  root /home/deploy/www-frontend/current/public;

  location / {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
  }

  error_page 500 502 503 504 /50x.html;
}
Run Code Online (Sandbox Code Playgroud)

error_page指令在那里,我有sudo'd作为www-data(Ubuntu)并验证我可以cat文件,因此它不是权限问题.使用上面的配置文件,并且service nginx reload,我在错误时收到的页面仍然是"内部服务器错误".

我的错误是什么?

Ste*_*lie 79

error_page处理由nginx生成的错误.默认情况下,无论http状态代码如何,nginx都将返回代理服务器返回的任何内容.

您正在寻找的是proxy_intercept_errors

该指令决定nginx是否会拦截HTTP状态代码为400或更高的响应.

默认情况下,所有响应都将按原样从代理服务器发送.

如果将此设置为on,则nginx将拦截由error_page指令显式处理的状态代码.具有与error_page指令不匹配的状态代码的响应将按原样从代理服务器发送.

  • 只需快速记录4年前的响应 - 现在`proxy_intercept_errors`适用于等于或大于300的错误. (12认同)
  • 我知道这是 RTFM 的问题。感谢您花时间提供很好的答案! (2认同)

Ale*_*xey 17

您可以为该位置设置proxy_intercept_errors

location /some/location {
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_connect_timeout 5;
    proxy_read_timeout 240;
    proxy_pass http://127.0.0.1:4701/;
    proxy_intercept_errors on; # see http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors

    error_page 400 500 404 ... other statuses ... =200 /your/path/for/custom/errors;
}
Run Code Online (Sandbox Code Playgroud)

而你可以设置200其他状态你需要的

  • 使用`proxy_intercept_errors;`(不带参数)在当前的nginx中不再有效.使用`proxy_intercept_errors on;而不是. (6认同)

Aft*_*eed 5

将FastCGI用作上游的人需要打开此参数

fastcgi_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)

对于我的PHP应用程序,我在上游配置块中使用它

 location ~ .php$ { ## Execute PHP scripts
    fastcgi_pass   php-upstream; 
    fastcgi_intercept_errors on;
    error_page 500 /500.html;
 }
Run Code Online (Sandbox Code Playgroud)