HTTP 与 80 端口
80 是 HTTP 的默认端口,浏览器访问域名不带端口时默认连它。HTTPS 普及后,80 的合理角色从承载页面变成三件事:把流量 301 跳到 443、承接 ACME 的 http-01 证书验证、以及少数必须固定回调地址的第三方对接。Apache 与 IIS 的默认站点同样监听 80。
基本信息
| 服务 | HTTP(Nginx / Apache httpd / IIS) |
|---|---|
| 协议 | TCP |
| 用途 | 网页访问、跳转 443、ACME 证书验证 |
| 权限要求 | 监听 80 需 root 或 CAP_NET_BIND_SERVICE |
| 常见配置 | /etc/nginx/conf.d/*.conf、/etc/httpd/conf.d/*.conf |
典型使用场景
- 全站 301 跳转到 HTTPS,同时保留裸域名可访问
- 为 Let's Encrypt 等 ACME 客户端提供 http-01 验证路径
- 内网工具与状态页:只在内网提供轻量查看页面
- 老设备或嵌入式系统只支持 HTTP,需单独划一个受控 ingress
- 第三方回调:对方指定必须用 http 地址回调时,用独立 server 块隔离处理
查看响应头与跳转链
查看响应头与跳转链
curl -sI http://example.com | head -n 8 # 状态码、Location、Server
curl -s -o /dev/null -w 'code=%{http_code} url=%{redirect_url}\n' http://example.com/ # 一行抓出跳转目标
curl -sIL http://example.com | grep -iE '^HTTP/|^location:' # -L 跟随跳转,列出完整跳转链
curl -s -o /dev/null -w '%{http_code}\n' http://example.com/.well-known/acme-challenge/test # ACME 路径是否可达
ss -lntp | grep ':80 ' # 确认是谁在监听 80重定向链判读
| 现象 | 结论 | 处置方向 |
|---|---|---|
| 出现一次 301 后返回 200 | 标准全站跳转 | 无需处理 |
| 先 301 再 302 | 跳转配置叠加 | 排查是否 CDN 或负载均衡又加了一层 |
| 用 302 做全站跳转 | 临时跳转 | 改为 301,让浏览器与搜索引擎长期记住 |
| 跳到 https 后返回 404 | 443 上没有该域名的站点 | 补 server_name 与站点根目录配置 |
| 一直 301 指向自身 | 跳转环路 | 检查 listen 与 return 目标是否落在同一个 server 块 |
输出逐列读法
| 输出项 | 含义 | 正常/异常 |
|---|---|---|
| HTTP/1.1 301 | 协议版本与状态码 | 2xx/3xx 正常,5xx 说明后端或配置异常 |
| Location | 跳转目标地址 | 应为 https:// 同域名,出现其他域名要立刻核对 |
| Server | 服务端软件标识 | 建议隐藏具体版本号,减少指纹信息 |
| Content-Length 0 | 响应体长度 | 正常,跳转响应通常不带正文 |
Nginx 80 全量跳转
Nginx 80 全量跳转
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 保留原始路径与查询串
}
# 改完先测语法再重载
# nginx -t && nginx -s reloadACME 例外与续期验证
ACME 例外与续期验证
server {
listen 80;
server_name example.com;
location ^~ /.well-known/acme-challenge/ { root /var/www/acme; } # 验证路径不参与跳转
location / { return 301 https://$host$request_uri; }
}
# 续期前先确认路径可读
# sudo certbot renew --dry-run仍用纯 HTTP 承载登录表单或管理页时,口令与 Cookie 明文过网,链路上任何一跳都能读取甚至改写内容。
certbot --webroot 续期只访问 80 上的 /.well-known/acme-challenge/;该路径若被 301 覆盖,续期会静默失败,直到证书过期才被发现,这是证书突然失效最常见的原因。
HSTS 生效后浏览器会直接把 http 改写成 https,不再发出 80 请求;调试跳转配置时用无痕窗口或换测试域名,否则现象会被浏览器缓存干扰。
配置自查清单
- 确认 80 上只保留极简的跳转块,业务配置全部写在 443 的站点里
- 确认 ACME 验证路径未被跳转覆盖,且目录对 Web 运行用户可读
- 确认跳转用 301 并保留原始路径与查询串,不做成无条件跳首页
- 确认 Server 响应头未暴露具体版本号
- 确认临时回调或审批类路径有来源限制,不成为新的开放入口
- 确认监控同时探测 80 与 443,避免只看其中一个而漏掉跳转失效
- 开启 HSTS 前先确认全部子域名都能以 HTTPS 正常访问
证书续期链路验证
证书续期链路验证
sudo certbot renew --dry-run # 演练续期,不消耗签发额度
sudo certbot certificates # 查看当前证书路径与到期时间
sudo nginx -t && sudo nginx -s reload # 续期后重载,让新证书生效
curl -svo /dev/null https://example.com 2>&1 | grep -i 'subject' # 复核线上证书主体排查顺序:先用 curl 确认是否 301 以及 Location 是否正确,再带 Host 头直连 127.0.0.1:80 验证后端本身能否以该域名响应,最后核对 443 上对应 server 块是否存在;只盯着浏览器现象容易漏掉 vhost 缺失这类配置问题。
CDN 场景下的 80:回源可以走 80,但边缘到用户仍应走 443;若在 CDN 上开了强制 HTTPS 跳转而源站没同步配置,直接改 hosts 调试会得到与线上不一致的结果,容易误判成源站故障。