如何用PHP限制域名访问? | PHP安全配置优化指南

在PHP中限制域名访问可以通过检查HTTP请求中的Host头来实现,以下是几种实现方法:

php限制域名访问


方法1:直接比较域名(推荐)

// 允许访问的域名列表(不含端口)
$allowedDomains = [
    'example.com',
    'www.example.com',
    'app.example.com'
];
// 获取当前请求的域名(自动去除端口号)
$currentHost = strtolower(explode(':', $_SERVER['HTTP_HOST'])[0]);
// 验证域名
if (!in_array($currentHost, $allowedDomains)) {
    http_response_code(403); // 禁止访问
    exit('Access Denied: Invalid domain');
}
// 后续正常代码...

方法2:支持通配符的子域名匹配

$allowedPatterns = [
    'example.com',
    '*.example.com' // 允许所有子域名
];
$currentHost = strtolower(explode(':', $_SERVER['HTTP_HOST'])[0]);
$allowed = false;
foreach ($allowedPatterns as $pattern) {
    if ($pattern === $currentHost) {
        $allowed = true;
        break;
    }
    // 处理通配符 *.example.com
    if (strpos($pattern, '*') !== false) {
        $regex = '/^' . str_replace('*', '[^.]+', preg_quote($pattern, '/')) . '$/';
        if (preg_match($regex, $currentHost)) {
            $allowed = true;
            break;
        }
    }
}
if (!$allowed) {
    http_response_code(403);
    exit('Invalid domain');
}

方法3:通过.htaccess限制(更高效)

在网站根目录创建/修改.htaccess文件:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www.)?example.com$ [NC]
RewriteCond %{HTTP_HOST} !^app.example.com$ [NC]
RewriteRule ^ - [F] # 返回403禁止访问

注意事项:

  1. 安全性

    • Host头可被伪造,敏感操作需额外验证(如Session/Cookie)
    • 此方法主要用于防止用户通过非常用域名访问
  2. 特殊场景处理

    php限制域名访问

    // 处理直接通过IP访问的情况
    if (!isset($_SERVER['HTTP_HOST']) || is_numeric(str_replace('.', '', $_SERVER['HTTP_HOST']))) {
        exit('Domain access only');
    }
  3. 端口处理

    • 代码中已自动剥离端口(如 example.com:8080example.com
    • 如需允许特定端口,需在允许列表中添加带端口的域名

完整示例代码:

<?php
// config.php - 域名验证
$allowed = [
    'example.com',
    'www.example.com',
    '*.app.example.com'
];
$host = $_SERVER['HTTP_HOST'] ?? '';
if (empty($host)) die('Invalid request');
// 剥离端口
$host = strtolower(explode(':', $host)[0]);
$valid = false;
foreach ($allowed as $domain) {
    // 完全匹配
    if ($domain === $host) {
        $valid = true;
        break;
    }
    // 通配符匹配
    if (strpos($domain, '*') !== false) {
        $pattern = '/^' . str_replace('*', '.*', preg_quote($domain)) . '$/';
        if (preg_match($pattern, $host)) {
            $valid = true;
            break;
        }
    }
}
if (!$valid) {
    http_response_code(403);
    include('forbidden.html'); // 自定义错误页
    exit;
}
// 后续业务代码...
?>

常见问题解决:

  1. 本地开发绕过

    // 在检测前加入开发环境白名单
    if ($_SERVER['REMOTE_ADDR'] === '127.0.0.1') return;
  2. 负载均衡场景

    php限制域名访问

    • 如果使用CDN/代理,检查X-Forwarded-Host头:
      $host = $_SERVER['HTTP_X_FORWARDED_HOST'] ?? $_SERVER['HTTP_HOST'];
  3. 大小写问题

    • 使用strtolower()统一转为小写比较

选择最适合你项目需求的方法,通常推荐使用.htaccess进行服务器级限制以减少PHP解析开销。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/290256.html

(0)
上一篇 2026年2月10日 03:39
下一篇 2026年2月10日 03:46

相关推荐

  • 宽带连接自动弹出怎么回事?宽带连接自动弹出怎么办

    宽带连接自动弹出的核心解决方案在于精准定位故障源,绝大多数情况下,该现象并非宽带运营商线路故障,而是本地系统残留的拨号配置、恶意软件劫持或路由器固件异常导致的,解决此问题的关键在于阻断自动触发机制并重建安全的网络连接环境,而非盲目重置宽带设备,系统层面的“隐形劫持”与配置残留当宽带连接图标在无需操作的情况下自动……

    2026年4月28日
    0443
  • 只有一个虚拟主机,想省钱放两个网站,具体要怎么操作呢?

    在单一虚拟主机账户上托管多个网站,是许多站长和开发者在项目初期或管理多个小型项目时的常见需求,这不仅能有效节约成本,也便于集中管理,实现这一目标的核心功能通常是虚拟主机控制面板(如cPanel或Plesk)中的“附加域”功能,下面,我们将详细解析虚拟主机怎样放俩个网站的完整流程,准备工作:确保您的虚拟主机支持多……

    2025年10月13日
    01390
  • 手机宽带账号密码在哪里找,手机宽带账号密码查询方法

    精准获取与安全使用的专业指南在当前“万物互联”的数字环境中,手机宽带账号与密码不仅是接入家庭或企业网络的“数字钥匙”,更是保障网络安全、提升上网体验的核心要素,正确获取、规范存储、及时更新手机宽带账号和密码,是保障网络服务连续性、防范账号盗用与数据泄露的第一道防线,本文基于一线运维经验与用户实测反馈,结合酷番云……

    2026年4月18日
    0441
    • 服务器间歇性无响应是什么原因?如何排查解决?

      根源分析、排查逻辑与解决方案服务器间歇性无响应是IT运维中常见的复杂问题,指服务器在特定场景下(如高并发时段、特定操作触发时)出现短暂无响应、延迟或服务中断,而非持续性的宕机,这类问题对业务连续性、用户体验和系统稳定性构成直接威胁,需结合多维度因素深入排查与解决,常见原因分析:从硬件到软件的多维溯源服务器间歇性……

      2026年1月10日
      020
  • php如何获取数据库中的数据?php从数据库提取数据的方法

    PHP获取数据库数据的核心在于安全、高效地建立连接与执行查询,其中使用预处理语句防止SQL注入是保障数据安全的关键底线,而合理优化查询逻辑与连接池管理则是提升性能的根本途径,在实际开发中,开发者不应仅仅满足于“能查出数据”,更应关注数据交互过程中的安全性、资源消耗以及异常处理机制,对于现代PHP应用而言,PDO……

    2026年3月9日
    0763

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注