网站接入HTTPS之后,很多站长以为流量就安全了,其实在用户第一次输入域名、还没跳转HTTPS的那一瞬间,攻击者依然可以用SSL剥离手段把请求拦到HTTP上。HSTS(HTTP Strict Transport Security)就是专门解决这个问题的机制:它让浏览器记住某个站点必须走HTTPS,连第一次访问都不允许用明文。

一、HSTS的工作原理与核心价值
HSTS的本质是一个HTTP响应头:Strict-Transport-Security。当浏览器收到这个头,就会在本地记录该域名在指定时长内只能使用HTTPS访问。即便用户手动把地址栏里的s删掉,或者点击了HTTP的链接,浏览器也会在内部先做307跳转再发请求,从而挡住中间人攻击。
这个机制特别适合已经全站HTTPS化的业务。没有HSTS时,从HTTP到HTTPS的跳转本身就可能被篡改;有了HSTS,浏览器根本不会发出HTTP请求。它还支持includeSubDomains参数,让所有子域名一并受保护,以及preload参数,允许把域名提交进浏览器内置列表,连首次访问都免遭降级。
二、宝塔面板中Nginx的配置文件位置
在宝塔面板里,我们不需要去SSH里找/etc/nginx/nginx.conf慢慢改,面板已经把每个站点的配置独立出来了。登录宝塔后台,打开左侧“网站”,点击目标站点右侧的“设置”,再选择“配置文件”选项卡,就能看到该站点对应的Nginx server块。
这个配置文件通常长这样:里面已经有listen 443 ssl、证书路径、根目录等基础内容。我们要做的就是在server块内部,找一个合适的位置(一般在ssl相关配置之后、location之前)加入HSTS响应头。宝塔不会覆盖你手动加的内容,只要语法正确,保存后重载Nginx即可生效。
三、在Nginx中添加HSTS响应头
最基础的写法是指定max-age,也就是浏览器记住HTTPS的秒数。下面是一段可直接粘贴进配置文件的示例:
server {
listen 443 ssl;
server_name example.ipipp.com;
ssl_certificate /www/server/panel/vhost/cert/example/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/example/privkey.pem;
# 开启HSTS,有效期一年,包含子域名并允许预加载
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
root /www/wwwroot/example;
index index.html;
}
注意上面的always参数很关键。Nginx的add_header默认只在响应码为200、201、204、206、301、302、303、304、307、308时才添加,加上always可以保证错误页也带上HSTS头,避免异常状态下策略失效。
如果你暂时只想在主域名生效、不想波及子域名,可以把includeSubDomains去掉;如果还没打算提交到预加载列表,也先别写preload。错误配置preload而又没真去提交,并不会出事,但写了却没全站HTTPS支撑,反而会导致子域无法访问。
四、开启前的必要检查与常见坑
在宝塔里点保存并重载Nginx之前,必须确认一件事:这个域名及其所有用到的子域名都已经能正常通过HTTPS访问。因为一旦浏览器收到HSTS头,在max-age时间内它拒绝任何HTTP连接。假如你的后台、接口或者静态资源还在用HTTP,用户就会直接看到连接失败。
另一个常见坑是只在80端口的server块里加HSTS。实际上HTTP响应里带这个头没有意义,甚至可能被攻击利用。正确做法是在443的server块加,同时把80的请求用return 301跳到https,示例如下:
server {
listen 80;
server_name example.ipipp.com;
return 301 https://$host$request_uri;
}
这样用户即使访问HTTP,也会被重定向,且真正的HSTS策略由HTTPS响应下发。等配置稳定跑一段时间、确认无HTTP依赖后,再考虑把域名提交到hstspreload列表,获得更强保护。
五、验证HSTS是否生效
配置完在宝塔重载Nginx,可以用浏览器开发者工具看响应头。打开Network面板,访问一次站点,点开主文档请求,在Response Headers里应该能看到strict-transport-security: max-age=31536000; includeSubDomains; preload这一行。
也可以用命令行快速确认,例如执行:curl -I https://example.ipipp.com,在输出的头部里查找Strict-Transport-Security字段。看到它就意味着浏览器下次访问会强制走HTTPS,你的站点已经补上了传输层安全里最容易漏掉的那块短板。