php实现http代理
PHP 实现 HTTP 代理
使用 cURL 实现简单代理
通过 PHP 的 cURL 扩展可以实现基本的 HTTP 代理功能。以下是一个简单的代理脚本示例:
<?php
$targetUrl = $_GET['url'] ?? '';
if (empty($targetUrl)) {
header('HTTP/1.1 400 Bad Request');
exit('Missing URL parameter');
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $headerSize);
$body = substr($response, $headerSize);
foreach (explode("\r\n", $headers) as $header) {
if (!empty($header)) {
header($header);
}
}
echo $body;
curl_close($ch);
?>
处理 POST 请求
对于 POST 请求,需要额外处理请求体和请求方法:
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'POST') {
$postData = file_get_contents('php://input');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
$headers = getallheaders();
foreach ($headers as $name => $value) {
if (strtolower($name) !== 'host') {
curl_setopt($ch, CURLOPT_HTTPHEADER, ["$name: $value"]);
}
}
}
添加身份验证
如果需要为代理添加基本身份验证:
if (!isset($_SERVER['PHP_AUTH_USER']) ||
$_SERVER['PHP_AUTH_USER'] !== 'username' ||
$_SERVER['PHP_AUTH_PW'] !== 'password') {
header('WWW-Authenticate: Basic realm="Proxy"');
header('HTTP/1.0 401 Unauthorized');
exit('Authentication required');
}
使用流上下文实现代理
PHP 的流上下文也可以实现简单的代理功能:
$context = stream_context_create([
'http' => [
'proxy' => 'tcp://proxy.example.com:8080',
'request_fulluri' => true,
]
]);
$response = file_get_contents($targetUrl, false, $context);
header('Content-Type: ' . $http_response_header[0]);
echo $response;
性能优化建议
对于高频使用的代理,可以考虑以下优化措施:
- 启用 OPcache 加速 PHP 执行
- 使用连接池管理 cURL 句柄
- 添加适当的缓存头控制
- 实现请求限流防止滥用
安全注意事项
- 验证目标 URL 防止 SSRF 攻击
- 过滤敏感头信息如 Cookie、Authorization
- 限制允许访问的域名白名单
- 记录日志监控异常请求
以上方法提供了 PHP 实现 HTTP 代理的基本思路,实际应用中需要根据具体需求进行调整和完善。







