errorpage
可触发errorpage阶段
| 阶段 |
是否可触发error_page |
说明 |
rewrite_by_lua |
✅可以 |
常用于URI重写或拦截非法请求 |
access_by_lua |
✅可以 |
常用于鉴权、访问控制 |
content_by_lua |
✅可以 |
只要未输出响应体,状态码仍可变 |
log_by_lua |
❌不可以 |
响应已发出,阶段太晚 |
header_filter_by_lua |
⚠️通常不用于此目的 |
原理上可以设置ngx.exit,但副作用大,容易错误 |
body_filter_by_lua |
❌不可以 |
响应体处理中,不能修改状态码来触发error_page |
无法触发error_page
你已经调用了ngx.say()/ngx.print()/ngx.send_headers()(响应头已发送)后再ngx.exit(403)→❌无效
body_filter_by_lua是处理已发送的响应体,此时Nginx状态机不再支持跳转到errorpage
log_by_lua是收尾阶段,仅用于日志记录,不影响响应流程
推荐阶段
| 场景 |
推荐阶段 |
原因 |
| 鉴权、IP黑名单 |
access_by_lua |
可精确拦截非法请求,适合403 |
| 路由校验、URL检查 |
rewrite_by_lua |
拦截非法路径,适合404 |
| 内容生成失败 |
content_by_lua |
返回500或自定义错误码 |