脚本功能:用户访问当前域名,经过PHP脚本处理,将请求数据转发到管理员设置的其他固定地址上。
代码如下:
$proxy_url = 'http://www.b.com'; //将当前请求代理到这个地址
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $proxy_url . $_SERVER['REQUEST_URI']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $_SERVER['REQUEST_METHOD']);//请求方式,GET、POST等
curl_setopt($ch, CURLOPT_POSTFIELDS, file_get_contents("php://input"));//原始请求数据
curl_setopt($ch, CURLOPT_HTTPHEADER, getHeader());//请求的头部
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch);
// 获得响应结果里的:头大小
$headerSize = curl_getinfo($ch,CURLINFO_HEADER_SIZE);//获取头部信息
// 根据头大小去获取头信息内容
$header = substr($response, 0, $headerSize);
$headerArray = explode(PHP_EOL,$header);
curl_close($ch);
foreach ($headerArray as $item){
header($item);//头部
}
echo substr($response, $headerSize);//输出内容
function getHeader()
{
$headers = [];
$webServer = strtolower($_SERVER['SERVER_SOFTWARE']);
if (strpos($webServer, 'apache') !== false) {//apache服务器
$allHeaders = getallheaders();
foreach ($allHeaders as $headerName => $headerValue) {
if(strtolower($headerName) == 'host') {
continue;
}
$headers[] = $headerName . ':' . $headerValue;
}
}
return $headers;
}
代码比较简单,但能用。你可以把代码优化、扩展,封装成一个通用的类。
494

被折叠的 条评论
为什么被折叠?



