2021-01-29 乐帮网
nginx
原本Nginx自定义错误页面是一件很容易的事情,自己尝试了一下结果发现总是不跳转,网上例子到不少,没有直接能用的。因为我这站点使用的是反射代理,不是静态的站点。那正确的配置是怎么写呢?首先要弄清楚整个过程,使用反向代理时Nginx遇到后端错误,会在配置中重新查找自定义错误页面,也就是这个解析过程走了两遍。剩下的就好说了。
关键配置如下:
proxy_intercept_errors on;
error_page 403 /errorpage/error_403.html;
error_page 404 /errorpage/error_404.html;
error_page 500 /errorpage/error_500.html;
error_page 502 /errorpage/error_502.html;
error_page 503 /errorpage/error_503.html;
error_page 504 /errorpage/error_504.html;
要注意的有几点:
1)漏掉了proxy_intercept_errors ,这时反向代理捕获不到服务器内部抛出的错误。
(2)有的教程使用了简写例如:
error_page 403 404 /errorpage/error_4xx.html;
error_page 500 501 502 503 503 504 /errorpage/error_5xx.html;
经测试这种配置不生效。这个也可能是我的其它的配置问题。
(3)假设后端遇到404时,以我的站点为例此时Nginx重新访问的是 https://lebang2020.cn/errorpage/error_404.html,要保证此url能在Nginx中解析到,或者是单独建立一条规则使用路径能正确对应上。例如:
location ^~ /errorpage/ {
internal;
root /var/www/publish
}
也就是我把错误文件都放到了/var/www/publish/errorpage/*
最后赋上我的一个完整示例:(我的页面放到代理中,所有无须再单独配置规则)
server{
listen 443 ssl;
server_name www.lebang2020.cn;
ssl_certificate /usr/nginx/lebang2020.cn.pem;
ssl_certificate_key /usr/nginx/lebang2020.cn.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
proxy_intercept_errors on;
error_page 403 /errorpage/error_403.html;
error_page 404 /errorpage/error_404.html;
error_page 500 /errorpage/error_500.html;
error_page 502 /errorpage/error_502.html;
error_page 503 /errorpage/error_503.html;
error_page 504 /errorpage/error_504.html;
location / {
proxy_pass http://localhost:8083;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
}
location /res/images/ {
root /usr/wwwroot/;
expires 2h;
}
}
如有问题可以在我的公众号留言讨论, lebang2020.cn出品。
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力