php实现域名授权
域名授权的基本原理
域名授权通常用于限制PHP脚本只能在特定域名下运行,防止未经授权的域名调用脚本。实现方式包括验证HTTP请求中的域名信息、服务器变量检查或结合加密验证。
验证HTTP_HOST
通过检查$_SERVER['HTTP_HOST']或$_SERVER['SERVER_NAME']获取当前访问域名,与授权域名列表比对:

$allowedDomains = ['example.com', 'sub.example.com'];
$currentDomain = $_SERVER['HTTP_HOST'];
if (!in_array($currentDomain, $allowedDomains)) {
header('HTTP/1.1 403 Forbidden');
exit('Domain access denied');
}
使用加密签名
生成包含域名的加密令牌,客户端需携带该令牌验证合法性:
$secretKey = 'your_secret_key';
$authorizedDomain = 'example.com';
$token = md5($authorizedDomain . $secretKey);
// 客户端请求需携带token参数
if ($_GET['token'] !== $token) {
die('Invalid domain authorization');
}
结合数据库验证
存储授权域名到数据库,动态验证请求来源:

$db = new PDO('mysql:host=localhost;dbname=auth_db', 'user', 'pass');
$stmt = $db->prepare("SELECT 1 FROM allowed_domains WHERE domain = ?");
$stmt->execute([$_SERVER['HTTP_HOST']]);
if (!$stmt->fetch()) {
header('Location: https://error.com/unauthorized');
exit;
}
通过.htaccess限制
Apache服务器可通过配置文件限制访问来源:
RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteRule ^ - [F]
动态脚本授权
对于API或远程调用场景,使用时间戳+域名生成动态签名:
$domain = $_SERVER['HTTP_HOST'];
$timestamp = time();
$validWindow = 300; // 5分钟有效期
$signature = hash_hmac('sha256', $domain.$timestamp, 'secret_key');
if (abs(time() - $_GET['timestamp']) > $validWindow
|| $_GET['sign'] !== $signature) {
die('Authorization failed');
}
注意事项
- HTTP_HOST可能被伪造,需结合其他验证手段
- 考虑使用HTTPS防止中间人攻击
- 重要系统建议结合IP白名单验证
- 定期更新加密密钥增强安全性






