nginx error_page 404 不支持变量解析,静态跳转用 error_page 404 =302 /;动态搜索跳转需配合命名 location 和 return 指令;自定义 404 页面应配置 internal 保护并保持 404 状态码。

直接用 error_page 404 跳转到搜索页或首页,看似简单,但容易踩坑。关键在于:Nginx 的 error_page 指令本身**不解析变量**,写成 error_page 404 http://example.com/search?q=$uri 是无效的——$uri 会被当作字面字符串发送,不是真实路径。
跳转到首页(静态重定向)
这是最稳妥、最常用的方式。适用于用户迷路后想快速回到主站:
- 在
server或location块中添加:error_page 404 =302 /; - 注意
=302表示返回 302 状态码并重定向,避免返回 404 状态却显示首页内容(对 SEO 不友好) - 如果首页是
https://example.com/home,可写为:error_page 404 =302 /home;
跳转到带原始路径的搜索页(动态拼接)
想把用户请求的路径(如 /article/abc)自动作为搜索关键词,必须绕过 error_page 的变量限制,改用命名 location + return:
- 先捕获 404 错误:
error_page 404 @to_search; - 再定义内部跳转逻辑:
location @to_search {<br> return 302 https://www.sogou.com/web?query=$request_uri;<br>} - 若用百度,把
query=换成wd=:return 302 https://www.baidu.com/s?wd=$request_uri; -
$request_uri包含开头的/,搜索引擎能正常识别;如需更干净(去掉/),可用正则提取:if ($request_uri ~ ^/(.*)$) { return 302 https://sogou.com/web?query=$1; }(注意:仅限location内使用)
跳转到自定义 404 页面(兼顾体验与 SEO)
比直接跳转更友好:展示提示信息 + 提供搜索框 + 返回首页链接,同时保持 404 状态码:
- 准备一个 HTML 文件,例如
/usr/share/nginx/html/404.html - 配置:
error_page 404 /404.html;<br>location = /404.html {<br> internal;<br> root /usr/share/nginx/html;<br>} -
internal确保该页面只能由 Nginx 内部跳转访问,防止用户直接访问/404.html - 页面内可用 JavaScript 实现“3 秒后跳首页”或“点击搜索当前路径”,增强交互性
注意事项
避免常见错误:
- 不要在
error_page后直接跟含变量的 HTTP 地址,Nginx 不展开 - 不要开启
proxy_intercept_errors on(默认 off),否则后端 404 会被 Nginx 拦截,无法触发error_page @named跳转逻辑 - 如果用了
proxy_pass,确保后端真实返回 404(而非 200 + 自定义错误体),否则 Nginx 不会触发 error_page - 测试时用
curl -I URL查看实际返回的状态码和 Location 头,确认是否符合预期










