本文目录导读:

在 PHP 中实现 HSTS(HTTP Strict Transport Security)主要有以下几种方法:
在 PHP 代码中设置 Header
基础设置
// 在页面输出的最顶部设置
header('Strict-Transport-Security: max-age=31536000; includeSubDomains');
完整设置(推荐)
// 强制 HTTPS 并设置 HSTS
if ($_SERVER['HTTPS'] != 'on' && $_SERVER['HTTP_X_FORWARDED_PROTO'] != 'https') {
header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], true, 301);
exit;
}
// 设置 HSTS(仅在 HTTPS 连接时发送)
if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
}
带预加载的 HSTS
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
在 PHP 配置文件中设置(多个页面共用)
创建公共配置文件 config.php
<?php
// config.php
function enforceHTTPS() {
// 强制 HTTPS
if (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] !== 'on') {
$redirect_url = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
header("Location: " . $redirect_url, true, 301);
exit();
}
// 设置 HSTS header
header("Strict-Transport-Security: max-age=31536000; includeSubDomains; preload");
}
// 调用函数
enforceHTTPS();
然后在其他 PHP 文件中引用:
<?php require_once 'config.php'; // 其他代码...
使用 .htaccess(Apache)
如果使用 Apache,可以在 .htaccess 中设置:
# 强制 HTTPS 并设置 HSTS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# 设置 HSTS Header
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
使用 nginx 配置
server {
listen 443 ssl;
# ... SSL 配置 ...
# 设置 HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 将 HTTP 重定向到 HTTPS
}
HSTS 参数说明
// 不同的参数组合
$hsts_params = [
// 基础 - 有效期 1 年
'max-age=31536000',
// 包含子域名
'max-age=31536000; includeSubDomains',
// 包含预加载请求
'max-age=31536000; includeSubDomains; preload',
// 开发环境 - 较短有效期
'max-age=86400',
// 测试时禁用
'max-age=0'
];
// 使用示例
header('Strict-Transport-Security: ' . $hsts_params[2]);
完整的 PHP 实现示例
<?php
class SecurityHeaders {
public static function applyHSTS() {
// 检查是否 HTTPS
$is_https = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on')
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https');
if ($is_https) {
// 生产环境配置
if ($_SERVER['SERVER_NAME'] === 'example.com') {
header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');
} else {
// 开发/测试环境
header('Strict-Transport-Security: max-age=3600; includeSubDomains');
}
// 其他安全 header
header('X-Content-Type-Options: nosniff');
header('X-Frame-Options: SAMEORIGIN');
header('X-XSS-Protection: 1; mode=block');
}
}
}
// 调用
SecurityHeaders::applyHSTS();
注意事项
重要提示:
- HSTS 只应在 HTTPS 连接下设置,在 HTTP 下设置无效
- 设置
preload参数需要先提交到 HSTS Preload List - 一旦浏览器缓存 HSTS,无法通过 HTTP 访问,需要等缓存过期
- 测试时建议使用短有效期,如
max-age=3600
验证是否生效:
# 使用 curl 检查 header curl -I https://your-domain.com # 或使用浏览器开发者工具查看响应头
正确的 HSTS 实现能够有效防止 SSL 剥离攻击,显著提升网站安全性,但需要注意,一旦启用,需要确保 HTTPS 配置完全正确并长期维护。