使用Nginx自定义坏网关页面

使用Nginx自定义坏网关页面,nginx,Nginx,是否可以在Nginx中提供自定义的“坏网关”错误页面 类似于自定义404页面。类似于设置自定义404页面。这是我得到的 #site-wide error pages error_page 404 /404.html; error_page 500 502 503 504 /500.html; 要显示自定义错误页面而不是一般的“坏网关”错误,必须有三个部分 您必须创建一个名为“500.html”的html文件,并将其放在根目录中。对于运行在Nginx后面的Rails,这意味着将其置于public

是否可以在Nginx中提供自定义的“坏网关”错误页面


类似于自定义404页面。

类似于设置自定义404页面。这是我得到的

#site-wide error pages
error_page 404 /404.html;
error_page 500 502 503 504 /500.html;

要显示自定义错误页面而不是一般的“坏网关”错误,必须有三个部分

  • 您必须创建一个名为“500.html”的html文件,并将其放在根目录中。对于运行在Nginx后面的Rails,这意味着将其置于public/500.html

  • 您的配置文件中必须有一行至少指向500.html页面的502错误,如下所示:

    error_page 502 /500.html;
    
    server {
        listen 80; listen [::]:80;
        server_name www.mywebsite.com;
    
        error_page 502 /502.html;
        location /502.html {
            root /var/www/html;
        }
    }
    
  • 配置文件中必须有/500.html的位置块。如果已定义根,则此块可以为空。但这一障碍必须存在

    location /500.html{
    }
    
  • 是的,这是可能的

    在你的终端中输入这个

    cd /etc/nginx
    
    sudo nano nginx.conf
    
    在http下添加这些行

        error_page 500 Path_to_your_custom_error_page;
        error_page 503 Path_to_your_custom_error_page;
        error_page 504 Path_to_your_custom_error_page;
    
    现在通过键入以下命令重新启动nginx:

    sudo service nginx restart
    
    Bingo现在您可以使用debian(实际上是9.3 stretch)在网关错误上看到自定义错误消息。我执行了以下步骤:

    • 使用502错误页面的内容创建
      /var/www/html/502.html

    • 编辑
      /etc/nginx/sites enabled/mywebsite.conf

    所以它看起来像这样:

    error_page 502 /500.html;
    
    server {
        listen 80; listen [::]:80;
        server_name www.mywebsite.com;
    
        error_page 502 /502.html;
        location /502.html {
            root /var/www/html;
        }
    }
    
    • 然后使用服务nginx restart重新启动nginx

    问题并没有说,但当API位于nginx传递代理之后时,遇到这个问题是很常见的,因此在这种情况下,您希望响应是JSON而不是HTML

    我最喜欢的方法是使用
    error\u page
    指令的重定向功能重定向回同一站点上的错误页面:

    error_page 502 503 $scheme://$server_name/500.json;
    
    这是一行代码,您可以将相同的
    500.json
    重新用于不同的
    位置
    ,并且不需要神秘的空
    位置
    。将错误消息放在站点根目录下的
    500.json
    文件中。我假设您已经有了一个提供静态文件的
    location/{…}
    指令


    当然,您也可以使用同样的方法来提供HTML错误页面。

    虽然@Larsenal的答案在技术上对于最低配置是正确的,但有一些常见的配置会使它无法工作@Jack Desert的回答涉及到了这一点,但没有提供一个关于为什么需要这样做的完整解释

    假设我们有这个配置(从@Jack简化)

    这意味着,在内部发生502或504错误的情况下,将原始URI重写为
    /my error page.html

    我认为大多数人错过的是,这个经过相同的处理链,就像您直接请求该页面一样。这意味着它要经过所有相同的位置块检查

    因为在nginx上执行反向代理的常用方法是配置
    位置/{
    块,该位置与
    /my error page.html
    匹配,因此nginx尝试使用代理服务错误文件。由于常见的用例是在后端关闭的情况下服务静态文件,因此从后端服务此错误页也可能失败,使nginx默认为服务其自己的interna我们最初试图替换的错误页面


    因此,@Jack Desert建议,一个常见的解决方案是在
    位置
    块之前包含另一个
    位置
    块,该块将与
    /my error page.html
    URL相匹配。请注意,nginx配置中位置块的顺序没有影响;有一组非常具体的规则用于选择lo的优先级基于URL的位置块。该位置块需要像nginx可能提供的任何其他静态文件一样具有为该文件提供服务所需的任何内容。这意味着某个位置需要一个
    root
    指令,并且
    /my error page.html
    将相对于该位置加载(
    root
    几乎可以在nginx配置的任何级别进行设置).

    谢谢!我会尝试你的答案,然后回来更新线程。这对我来说不起作用,我想知道在较新版本的nginx中行为是否发生了变化。我尝试过并使其工作。确认。这不起作用。这不应该是正确的答案。你需要将这些行添加到哪个文件?该文件位于何处?这不正确对我有效,但按照@jack desert提到的确切步骤进行操作。这应该是可接受的答案,我可以确认它对我有效,并且我可以按照上述确切步骤进行自定义502错误响应。当前可接受的答案具有误导性,不起作用。Sweet。您还可以在位置块I中指定
    root
    f您希望错误页面位于不同的位置。如何显示所有500个错误?错误页面500 501 502 503 504/500.html;尝试(在nginx/1.2.1上对我有效)我的centos的默认配置是/etc/nginx/conf.d/default.confI中提到的/usr/share/nginx/html/50x.html。我用它来干扰分析跟踪以进行长期分析。你最好用这种方式抓取用户cookie,然后进行javascript重定向。在这个问题的所有答案中,这是我发现的唯一既准确又完整的答案。其他答案中遗漏了太多细节,以至于我无法让它们发挥作用。对于熟悉Nginx配置的人来说,这些细节将一文不值,但我不是。这个答案给出了我实际实现OP目标所需的确切操作。