流程

  • 收集头部信息
  • 收集请求数据
  • 转换头部信息为 CURL 头部请求格式
  • 使用 Curl 进行转发

收集 HTTP 头信息

function getAllHeaders() {
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}

使用 PHP 封装协议获取输入数据

$content = file_get_contents('php://input')

转换头信息为 Curl 请求格式

$headers = getAllHeaders();
$header_joins = [];
foreach ($headers as $k => $v) {
if ($k == 'X-Pingplusplus-Signature' || $k == 'Content-Type')
array_push($header_joins, $k . ': ' . $v);
}

使用 Curl 进行转发

function post($url, $headers, $raw_data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $raw_data); // Post Data
curl_setopt($ch, CURLOPT_URL, $url);//设置要访问的 URL
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); //模拟用户使用的浏览器
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //设置超时时间
curl_setopt($ch, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 收集结果而非直接展示
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 自定义 Headers
$result = curl_exec($ch);
curl_close($ch);
return $result;
} // $result = post($url, $headers, $raw_data);

示例

<?php
// @ini_set('display_errors', 1); function getAllHeaders() {
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
} $content = file_get_contents('php://input'); $headers = getAllHeaders();
$header_joins = [];
foreach ($headers as $k => $v) {
if ($k == 'X-Pingplusplus-Signature' || $k == 'Content-Type')
array_push($header_joins, $k . ': ' . $v);
} // print_r($header_joins);die(); function post($url, $headers, $raw_data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $raw_data); // Post Data
curl_setopt($ch, CURLOPT_URL, $url);//设置要访问的 URL
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); //模拟用户使用的浏览器
@curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); // 使用自动跳转
curl_setopt($ch, CURLOPT_TIMEOUT, 60); //设置超时时间
curl_setopt($ch, CURLOPT_AUTOREFERER, 1 ); // 自动设置Referer
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 收集结果而非直接展示
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 自定义 Headers
$result = curl_exec($ch);
curl_close($ch);
return $result;
} $result = post('http://rgjc6z4v2x.proxy.qqbrowser.cc/api/pingxx', $header_joins, $content); echo $result;

最新文章

  1. Unity 序列化 总结
  2. spring mvc 详细配置(转)
  3. Trace文件过量生成问题解决
  4. 【由VerySky原创】由Number Range 导致凭证生成但无法保存的问题
  5. Java Properties工具类详解
  6. php获取json文件数据并动态修改网站头部文件meta信息 --基于CI框架
  7. CentOS中yum安装软件时报错:No package XXX available
  8. WPF之外观模式
  9. python 自动化之路 day 08_2 网络编程
  10. 原生js表单序列化----- FormData
  11. 用Mysql进行emp、dept、salgrade表的相关查询操作
  12. gradlew和gradle的区别
  13. app微信支付-java服务端接口 支付-查询-退款
  14. Python复习笔记(七)线程和进程
  15. css一些基础效果
  16. maven插件之checkstyle
  17. 从上往下打印二叉树(python)
  18. 【NLP】文本相似度
  19. Python threads synchronization: Locks, RLocks, Semaphores, Conditions, Events and Queues(Forwarding)
  20. 利用Python进行端口扫描

热门文章

  1. C#在不同平台下DLL的引用问题
  2. No.5一步步学习vuejs之事件监听和组件
  3. Maven+MyBatis 初试
  4. HOST文件配置
  5. RegExp.prototype.exec()使用技巧
  6. js实现字体和容器宽高随窗口改变
  7. webservice使用EF生成的model序列化问题
  8. 将ReportingService 2008配置为匿名访问 - 转载
  9. CentOS7 下安装 SublimeText3
  10. world特殊控制符输入