# ============================================================
# Nginx HSTS 安全配置示例
# ============================================================
#
# 功能说明:
# - HTTP Strict Transport Security 头部
# - 强制浏览器使用 HTTPS 连接
# - 防止协议降级攻击
#
# Lolly 对应配置:
# server:
#   ssl:
#     hsts:
#       max_age: 31536000  # 1年
#       include_sub_domains: true
#       preload: false
# ============================================================

server {
    listen 443 ssl http2;
    server_name hsts.example.com;

    ssl_certificate /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols TLSv1.2 TLSv1.3;

    # HSTS 头部配置
    # Lolly 对应: ssl.hsts 配置块
    # max_age: 过期时间（秒），建议至少 6 个月（15768000）
    # includeSubDomains: 包含所有子域名
    # preload: 加入浏览器预加载列表（需提交到 hstspreload.org）
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # 注意:
    # 1. 首次设置建议使用较短 max-age（如 300），确认无问题后再延长
    # 2. preload 需要满足条件并主动提交到 hstspreload.org
    # 3. always 参数确保即使响应是错误页面也发送 HSTS 头

    location / {
        root /var/www/html;
    }
}

# HTTP 重定向（配合 HSTS）
server {
    listen 80;
    server_name hsts.example.com;

    # 301 永久重定向
    # HSTS 首次访问时仍然可能通过 HTTP，需要重定向配合
    return 301 https://$host$request_uri;
}

# HSTS 配置最佳实践:
#
# 1. 分阶段部署:
#    第一阶段: max-age=300 (5分钟)
#    第二阶段: max-age=86400 (1天)
#    第三阶段: max-age=604800 (1周)
#    最终阶段: max-age=31536000 (1年)
#
# 2. Preload 列表:
#    条件:
#    - max-age >= 31536000 (1年)
#    - includeSubDomains
#    - preload
#    - 所有域名都支持 HTTPS
#    提交: https://hstspreload.org
#
# 3. 移除 HSTS:
#    设置 max-age=0 可让浏览器清除 HSTS 设置
#    注意: 已加入 preload 列表的域名移除较困难
#
# 4. 测试:
#    curl -I https://hsts.example.com
#    # 检查 Strict-Transport-Security 头部