
当共享主机(如 one.com)禁止远程数据库连接时,无法直接通过 php 的 sqlsrv_connect 等函数直连本地 sql server;正确方案是搭建中间代理服务——在可访问本地数据库的服务器(如家庭网络中的 web api)上暴露安全接口,再由托管站点通过 https + curl 调用该接口获取数据。
当共享主机(如 one.com)禁止远程数据库连接时,无法直接通过 php 的 sqlsrv_connect 等函数直连本地 sql server;正确方案是搭建中间代理服务——在可访问本地数据库的服务器(如家庭网络中的 web api)上暴露安全接口,再由托管站点通过 https + curl 调用该接口获取数据。
由于 one.com 等共享主机明确禁用外部数据库连接(且通常不启用 sqlsrv 扩展),硬性尝试直连不仅会失败,还存在严重安全隐患(如暴露数据库凭证、绕过防火墙策略)。可行的替代路径是采用「反向代理」架构:将数据获取逻辑移至你完全可控的环境(例如本地 Windows 机器、树莓派或云虚拟机),对外提供轻量级 HTTP 接口,再由 one.com 上的 PHP 页面以 REST 方式调用。
✅ 推荐实现步骤:
-
在本地搭建安全 API 端点(示例使用 PHP + Slim Framework 或原生 PHP)
// api/fetch-users.php(运行于可访问本地 SQL Server 的环境中) <?php header('Content-Type: application/json; charset=utf-8'); header('Access-Control-Allow-Origin: https://yourdomain.one.com'); // 严格限制来源 header('Access-Control-Allow-Methods: GET'); header('Access-Control-Allow-Headers: X-API-Key'); // 验证请求头密钥(防止未授权调用) if (!isset($_SERVER['HTTP_X_API_KEY']) || $_SERVER['HTTP_X_API_KEY'] !== 'your_strong_secret_key_123') { http_response_code(403); echo json_encode(['error' => 'Forbidden']); exit; } $serverName = 'localhost'; $connectionInfo = [ 'UID' => 'your_db_user', 'PWD' => 'your_secure_password', 'Database' => 'YourDB', 'Encrypt' => true, 'TrustServerCertificate' => false ]; $conn = sqlsrv_connect($serverName, $connectionInfo); if (!$conn) { http_response_code(500); echo json_encode(['error' => 'DB connection failed', 'details' => sqlsrv_errors()]); exit; } $stmt = sqlsrv_query($conn, "SELECT TOP 10 Name, Email FROM Users ORDER BY Id DESC"); $data = []; while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $data[] = [ 'name' => $row['Name']?->format('Y-m-d H:i:s') : $row['Name'], 'email' => $row['Email'] ]; } sqlsrv_free_stmt($stmt); sqlsrv_close($conn); echo json_encode(['success' => true, 'data' => $data]);⚠️ 注意事项:
- 必须配置防火墙/路由器端口转发(如 8080),并启用 HTTPS(推荐使用 Cloudflare Tunnel 或 ngrok 实现加密隧道);
- 绝对禁止将数据库凭据写入公开可访问目录;
- 使用
Access-Control-Allow-Origin白名单而非*,配合X-API-Key请求头做基础鉴权。
-
在 one.com 主机上调用该 API
// public_html/index.php(one.com 环境,无需 sqlsrv 扩展) <?php $apiUrl = 'https://your-tunnel-url.trycloudflare.com/api/fetch-users.php'; $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => ['X-API-Key: your_strong_secret_key_123'], CURLOPT_SSL_VERIFYPEER => false, // 生产环境应设为 true 并配置 CA 证书 ]); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode === 200) { $result = json_decode($response, true); if ($result['success']) { foreach ($result['data'] as $user) { echo "<p><strong>{$user['name']}</strong> — {$user['email']}</p>"; } } else { echo '<p>API returned error.</p>'; } } else { echo "<p>API request failed (HTTP {$httpCode}).</p>"; } ?>
? 总结:这不是“绕过限制”的技巧,而是遵循最小权限与分层安全原则的标准实践。数据库永远不应暴露于公网;所有跨域数据交互必须经由身份验证、传输加密与输入输出过滤的中间服务。若本地无固定公网 IP,推荐使用 Cloudflare Tunnel 或 ngrok 快速建立安全隧道,并配合 .htaccess 或 Nginx 规则进一步限制访问频率与来源。











