我正在尝试为我的 error_page 创建后备。基本上,逻辑应该类似于以下内容:
- 加载 foobar.html
- 远程服务器上不存在 -> 从远程服务器加载 404.html 以显示 404 页面
- 远程服务器上不存在 -> 在本地文件系统上加载 404.html
加载两者localhost/404.html
并localhost/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。