error_page 497 是 Nginx 原生支持的轻量可靠跳转机制,专用于拦截 HTTP 请求误发至 HTTPS 端口(如 http://example.com:443)并重定向至 HTTPS,无需 rewrite 或额外监听 80 端口,零运行时开销、避免循环重定向、SSL 握手前即生效。

直接在 HTTPS server 块里加 error_page 497 就能拦截并跳转,这是 Nginx 原生支持的机制,不需要额外 rewrite 或监听 80 端口。
为什么 497 是可靠切入点
当用户用 HTTP 协议访问本该走 HTTPS 的端口(比如直接敲 http://example.com:443),Nginx 会内部判定为“普通 HTTP 请求发到了 HTTPS 端口”,返回状态码 497,而不是 400。这个错误码不会暴露给用户,但可被 error_page 捕获——它专为此类误发设计,比靠 rewrite 或 return 更精准、更轻量。
基础配置写法
只需在启用 SSL 的 server 块中加入一行:
-
error_page 497 https://$host$request_uri;—— 默认 302 临时跳转,保留原始路径和查询参数 -
error_page 497 =301 https://$host$request_uri;—— 改为 301 永久跳转,利于 SEO 和浏览器缓存 -
error_page 497 =307 https://$host$request_uri;—— 保持原始请求方法(如 POST 不变),适合表单提交场景
注意端口号显式传递
如果 HTTPS 服务监听非标准端口(如 8443),而跳转后 URL 缺少端口,会导致失败。此时必须显式带上 $server_port:
error_page 497 https://$host:$server_port$request_uri;- 也可写作
error_page 497 https://$host:$server_port$uri$is_args$args;,语义更清晰
配合 listen 多端口提升兼容性
常见做法是让同一个 server 同时监听 80 和 443:
-
listen 443 ssl;—— 主 HTTPS 服务 -
listen 80;—— 接收习惯性 HTTP 请求,再用return 301跳转(这是另一路,与 497 无关) - 两者不冲突:80 端口走常规重定向;443 端口上误发的 HTTP 请求则由 497 拦截处理
不复杂但容易忽略


















