Nginx 不屏蔽 HTTP 流量,而是通过 301 重定向、返回 444 或按域名分别配置来控制:推荐 listen 80 + return 301 跳转 HTTPS;测试环境可用 return 444 断连;多站点需独立 server 块定义;禁用 if 判断,注意前端代理影响。

Nginx 本身不“屏蔽”HTTP 流量,而是通过拒绝响应或强制跳转来阻止非 HTTPS 访问。核心思路是:让 HTTP 请求无法正常获得服务——要么直接返回错误,要么 301 重定向到 HTTPS,要么干脆关闭连接。
以下是几种主流、可靠且生产环境常用的方式:
强制 HTTP → HTTPS 重定向(推荐)
这是最常见也最友好的做法,对用户透明,同时满足安全合规要求(如 HSTS、等保):
server {
listen 80;
server_name example.com www.example.com;
# 所有 HTTP 请求统一跳转到 HTTPS
return 301 https://$host$request_uri;
}⚠️ 注意:
-
$host保留原始域名(含端口时需处理,但 80 端口通常省略) -
return 301比rewrite更高效、更安全,Nginx 官方推荐 - 必须确保对应域名在
https的server块中已正确定义并监听 443 端口
直接拒绝 HTTP 请求(适合内部/测试环境)
若你明确不希望任何 HTTP 流量到达,可直接返回 444(Nginx 特有状态码,立即断连,无响应体):
server {
listen 80;
server_name _; # 匹配所有未声明的域名
return 444;
}✅ 优势:
- 不暴露任何响应头或页面,减少指纹泄露
- 防止爬虫、扫描器通过 HTTP 探测路径
- 日志中仅记录连接尝试,无完整请求解析
❌ 注意:
- 浏览器会显示“连接被重置”,用户体验差,不适用于面向公众的网站
- 需配合 DNS 或客户端配置,确保用户只访问 HTTPS 地址
按域名精细化控制(多站点场景)
当一台服务器托管多个域名,部分允许 HTTP,部分必须 HTTPS 时,可分别定义:
# 允许 HTTP 访问的站点(如内部管理后台)
server {
listen 80;
server_name admin.internal;
# 正常提供服务
}
# 强制 HTTPS 的公开站点
server {
listen 80;
server_name public.site;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name public.site;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# ……其余配置
}补充:防止 HTTP 请求绕过(关键细节)
-
不要依赖
if ($scheme = http):Nginx 中if在server级别不可靠,且易出错;应直接用独立listen 80块处理。 -
避免
rewrite+permanent混用:return 301更简洁、语义清晰、性能更好。 - 检查防火墙与负载均衡器:如果前端有 CDN 或 WAF,需确认它们是否已终止 HTTPS,否则 Nginx 的 80 端口可能根本收不到原始 HTTP 请求。
不复杂但容易忽略。


















