Laravel 10连接局域网SQL Server遇TCP Provider连接拒绝问题求助
解决Laravel 10连接局域网SQL Server被拒绝的问题(TCP Provider: 目标主动拒绝连接)
核心排查方向(针对ODBC测试成功但Laravel连接失败的场景)
1. 核对Laravel数据库加密配置(高频触发点)
ODBC测试默认可能未启用加密,但ODBC Driver 18 for SQL Server默认强制加密连接。检查你的.env配置:
DB_CONNECTION=sqlsrv DB_HOST=目标机器IP或主机名 DB_PORT=1433 # 命名实例可改为 DB_HOST=目标IP\实例名,留空DB_PORT DB_DATABASE=你的数据库名 DB_USERNAME=数据库账号 DB_PASSWORD=数据库密码 DB_ENCRYPT=false # 关键:和ODBC测试保持一致,关闭加密 DB_TRUST_SERVER_CERTIFICATE=true # 可选:如果目标服务器用自签名证书,需要开启
修改后执行php artisan config:clear刷新配置,再尝试连接。
2. 排查目标机器防火墙的精准规则
ODBC测试成功不代表防火墙对PHP/web服务器进程开放了端口:
- 打开目标机器的Windows Defender防火墙,进入「高级设置」:
- 添加入站规则:允许SQL Server程序(
C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Binn\sqlservr.exe)通过所有网络;或者直接允许1433端口(默认实例)/对应动态端口(命名实例)的TCP连接 - 若使用命名实例,必须确保SQL Server Browser服务已启动(服务列表里找到该服务,设为自动启动),否则无法解析实例对应的动态端口
- 添加入站规则:允许SQL Server程序(
- 临时测试:关闭目标机器防火墙,若Laravel能正常连接,说明是防火墙规则遗漏,再针对性添加允许规则。
3. 验证PHP原生连接(排除Laravel框架问题)
写一个简单的PHP脚本,直接用sqlsrv扩展测试连接,确认是否是Laravel配置的问题:
<?php $server = "目标机器IP,1433"; // 命名实例用 "目标IP\实例名" $config = [ "Database" => "你的数据库名", "Uid" => "账号", "PWD" => "密码", "Encrypt" => "no" ]; $conn = sqlsrv_connect($server, $config); if ($conn) { echo "连接成功"; } else { die(print_r(sqlsrv_errors(), true)); } ?>
如果脚本连接失败,说明是PHP环境或网络层面的问题;如果成功,回到Laravel检查config/database.php里的sqlsrv配置是否覆盖了.env的参数。
4. 确认SQL Server远程连接权限
- 打开SQL Server Management Studio,右键目标服务器→「属性」→「连接」,勾选「允许远程连接到此服务器」
- 检查登录账号的权限:确保用于连接的数据库账号拥有远程连接的权限,且默认数据库正确。
内容的提问来源于stack exchange,提问作者Salas23
相关产品推荐
相关产品推荐

