手动把地址里的 page 改成 999,页面标题还在,内容区一片空白,状态码却还是 200,用户会以为整个站点已经挂了。乍看像缓存或者权限的锅,追下去往往不是。

$max = $wp_query->max_num_pages;
if (get_query_var('paged') > $max && $max > 0) {
  wp_safe_redirect(get_pagenum_link($max));
  exit;
}

追下去是这么回事:查询结果为空但模板照常渲染,没有做页码越界判断,也没设置对应的状态码,空白页就这么出来了,状态码还让人以为是正常的。

「超出页码处理」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

具体做法是,先取出查询的最大页数,再拿当前的页码去比较;越界时跳到最后一页,同时保留原有的筛选参数;或者干脆明确返回 404 状态码,也不要用空白页兜着。

验收就看一点,越界页码会自动跳到最后一页,不再出现空白页和假的 200 响应。

作者 9823189