当远程错误页面不存在时如何使用本地错误页面?

当远程错误页面不存在时如何使用本地错误页面?

我正在尝试为我的 error_page 创建后备。基本上,逻辑应该类似于以下内容:

  1. 加载 foobar.html
  2. 远程服务器上不存在 -> 从远程服务器加载 404.html 以显示 404 页面
  3. 远程服务器上不存在 -> 在本地文件系统上加载 404.html

加载两者localhost/404.htmllocalhost/global404.html有效,但是当我中断localhost/404.html(通过从 http 服务器中删除文件)时,它不会global404.html按我预期的方式显示页面。

server {
    listen 80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

当我点击时,上述工作正常http://localhost/404.html(当 404.html 文件位于远程服务器上时,它显示,当我删除该文件时,它会加载 global404.html 文件)。

但是,当我输入不存在的页面时,我只得到默认的 nginx 404 页面。

答案1

感谢问题中留下的评论,我设法找到了recursive_error_pages允许级联/递归的选项error_pages。我觉得自己在文档中遗漏了它,真是太愚蠢了。

但简单地做

server {
    listen      80;
    server_name example.com www.example.com;
    proxy_intercept_errors on;
    recursive_error_pages on;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        error_page 404 /404.html;
    }

    location /404.html {
        proxy_pass http://localhost:3000/404.html;
        error_page 404 /global404.html;
    }

    location /global404.html {
        root /usr/share/nginx/html;
    }
}

效果很好。我喜欢 nginx。

相关内容