当前位置: 首页> 最新文章列表> 如何解决 PHP 函数 connect 遇到 “Host not allowed to connect” 错误的问题?

如何解决 PHP 函数 connect 遇到 “Host not allowed to connect” 错误的问题?

M66 2025-08-05

在使用 PHP 进行数据库连接时,尤其是使用 mysqli_connect() 或 PDO 连接数据库时,常见的错误之一就是:

Host 'xxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server

这个错误提示意味着数据库服务器拒绝了当前客户端主机的连接请求,主要原因是数据库服务器上的权限配置没有允许该客户端 IP 地址进行连接。

本文将详细讲解如何排查和解决这个问题。


1. 了解错误原因

MySQL 服务器允许用户连接时,不仅会验证用户名和密码,还会验证连接来源的主机地址。也就是说,即使用户名和密码正确,如果连接主机未被授权,也会被拒绝。

默认情况下,MySQL 只允许 localhost (本机)连接,远程连接需要额外配置。


2. 检查连接使用的主机名或 IP

连接时传入的主机名或 IP 是哪个?通常在 PHP 代码中是这样写的:

$mysqli = new mysqli('db.m66.net', 'user', 'password', 'database');

确保这里的主机名是数据库服务器的正确 IP 或域名。


3. 授权连接主机

要解决“Host not allowed to connect”问题,需要在 MySQL 服务器上给指定的客户端主机授权。

假设你的数据库用户名是 dbuser,需要允许从远程主机 IP 123.123.123.123 连接:

GRANT ALL PRIVILEGES ON database.* TO 'dbuser'@'123.123.123.123' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

如果你想允许所有主机连接(不建议生产环境使用),可以用 % 通配符:

GRANT ALL PRIVILEGES ON database.* TO 'dbuser'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

4. 修改 MySQL 配置允许远程连接

MySQL 默认绑定到 127.0.0.1,限制只能本机访问。

打开 MySQL 配置文件(通常是 /etc/mysql/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),找到这一行:

bind-address = 127.0.0.1

将其改为:

bind-address = 0.0.0.0

然后重启 MySQL 服务:

sudo service mysql restart

5. 防火墙配置

确保服务器防火墙允许外部访问 MySQL 默认端口 3306。

例如使用 ufw

sudo ufw allow 3306/tcp

6. PHP 示例代码

假设数据库服务器地址是 db.m66.net,连接代码示例:

<?php
$host = 'db.m66.net';
$user = 'dbuser';
$password = 'password';
$dbname = 'database';

$mysqli = new mysqli($host, $user, $password, $dbname);

if ($mysqli->connect_error) {
    die('连接失败: (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

echo '连接成功!';

$mysqli->close();
?>

7. 额外排查建议

  • 确认用户名和密码正确无误。

  • 确认 PHP 和 MySQL 服务器网络能互通,可以使用 pingtelnet db.m66.net 3306 测试。

  • 检查数据库用户权限,确保该用户有访问指定数据库的权限。

  • 查看 MySQL 错误日志,获取更多细节。