在PHP中限制特定域名访问网站,可以通过检查HTTP请求头中的HTTP_REFERER或HTTP_ORIGIN字段实现,以下是两种常用方法:

方法1:验证 Referer(适用于页面跳转)
// 允许访问的域名列表
$allowedDomains = [
'example.com',
'subdomain.example.com'
];
// 获取Referer并提取域名
$referer = $_SERVER['HTTP_REFERER'] ?? '';
$domain = parse_url($referer, PHP_URL_HOST);
// 验证
if (empty($referer) || !in_array($domain, $allowedDomains)) {
http_response_code(403); // 禁止访问
exit('Access Denied: Domain not allowed.');
}
// 正常执行业务代码...
方法2:验证 Origin(适用于AJAX/API请求)
// 允许访问的域名列表
$allowedOrigins = [
'https://example.com',
'https://subdomain.example.com'
];
// 获取Origin头
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
// 验证
if (!in_array($origin, $allowedOrigins)) {
http_response_code(403);
exit('Access Denied: Invalid origin.');
}
// 可选:设置CORS响应头(用于AJAX)
header("Access-Control-Allow-Origin: $origin");
header("Access-Control-Allow-Credentials: true");
重要注意事项:
-
安全性:
Referer和Origin可被伪造,不能依赖其做敏感操作的安全验证。- 关键操作(如支付、账户修改)应使用服务端会话(Session)或Token验证。
-
适用场景:
Referer:普通页面跳转、资源防盗链(图片/文件)。Origin:AJAX请求、API接口跨域控制。
-
直接访问处理:

- 直接输入URL访问时
Referer为空,需根据需求决定是否允许(示例代码中禁止了空Referer)。
- 直接输入URL访问时
-
通配符支持:
- 如需泛域名匹配(如
*.example.com),可用正则:$pattern = '/.example.com$/'; if (!preg_match($pattern, $domain)) { ... }
- 如需泛域名匹配(如
-
性能优化:
将域名列表缓存或存储在配置文件中,避免每次请求重复定义。

完整示例(结合两种方法):
$allowedDomains = ['example.com', 'api.example.com'];
$refererDomain = parse_url($_SERVER['HTTP_REFERER'] ?? '', PHP_URL_HOST);
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
// 验证Referer(非AJAX)或Origin(AJAX)
$isValid = in_array($refererDomain, $allowedDomains) ||
in_array(parse_url($origin, PHP_URL_HOST), $allowedDomains);
if (!$isValid) {
http_response_code(403);
exit('Domain not permitted.');
}
提示:对于生产环境,建议结合Web服务器(如Nginx/Apache)的访问控制,效率更高且减少PHP处理压力。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/289540.html

