Express中如何显示404页面并返回404状态码
当然搞定过!我之前做项目时也碰到过这个需求——一开始也是用302跳转到404页面,后来发现这样对SEO不太友好,而且用户体验也不如直接显示页面来得顺畅,折腾了几种方案终于搞定了,给你分不同场景说说怎么实现:
Nginx 配置
如果你的网站是用Nginx部署的,大概率之前的配置里用了return 302 /404.html这类重定向规则,要改成直接返回自定义404页面并设置404状态码:
在你的server配置块里添加或修改以下规则:
# 指定404错误时返回的页面 error_page 404 /custom-404.html; # 确保这个页面只能被内部错误触发,禁止用户直接访问它时也返回404 location = /custom-404.html { root /path/to/your/webroot; # 替换成你的网站根目录路径 internal; }
internal指令是关键,它能防止用户直接输入http://my-domain.com/custom-404.html时也返回404状态,同时保证当访问不存在的路径时,Nginx直接输出该页面内容,状态码为404,不会产生302跳转。
Apache 配置
如果用Apache,直接通过.htaccess配置就能实现:
# 直接指定404错误对应的页面 ErrorDocument 404 /custom-404.html # 注意:如果之前有导致302重定向的规则(比如RewriteRule ^.*$ /404.html [R=302,L]),一定要删掉这些规则
Apache会自动在用户访问不存在的路径时,输出custom-404.html的内容,并返回404状态码,完全不会触发重定向。
Node.js/Express 框架处理
如果你的网站是基于Express开发的,之前可能用了res.redirect('/404')来跳转到404页面,这会返回302状态码。改成下面的写法:
// 把这个中间件放在所有路由的最后,处理所有未匹配的请求 app.use((req, res) => { // 先设置404状态码,再渲染自定义404页面(如果用模板引擎的话) res.status(404).render('404', { pageTitle: '页面未找到' }); // 如果是静态HTML文件,用sendFile方法: // const path = require('path'); // res.status(404).sendFile(path.join(__dirname, 'public', 'custom-404.html')); });
这样处理后,客户端会直接收到404状态码和自定义页面的内容,没有任何跳转。
PHP 项目处理
如果是PHP驱动的网站,之前可能用了header("Location: /404.html", true, 302);来重定向,替换成下面的代码:
<?php // 先设置404响应状态码 http_response_code(404); // 输出自定义404页面的内容 include 'custom-404.html'; exit; ?>
这个逻辑很简单:先告诉服务器返回404状态,再输出页面内容,完全避免了重定向。
不管用哪种环境,核心都是不要用重定向指令,而是在当前的请求上下文里直接输出自定义404页面的内容,同时确保响应头的状态码被设置为404。这样就能实现和Google一样的效果——访问不存在的路径时,直接显示404页面,返回404状态码。
内容的提问来源于stack exchange,提问作者Tamiross

