需求场景:需要在服务器A绑定证书和域名指向。服务器B上有完整的项目。需要访问域名指向服务器A的网址,跳转到服务器B
步骤:
- 服务器A上在域名指向的web根目录下新建入口文件index.php,必须保证web server配置中默认优先访问的文件是index.html。同级目录下再新建index.html文件。index.html文件里面将前端的vue文件引入。
- index.php文件中用curl扩展封装好GET、POST、json等几种请求方法,用来抓取服务器B的数据用
- 登录信息的cookie处理:因为curl只能抓取数据,而不能是设置cookie生效。所以当我们在index.php里面再做一遍cookie的存储处理:setcookie(‘token’, $token, time() + 18000, “/”);(服务器B的存储已经不起作用了。)第四个参数说明的是当前所有目录都可以存储。
- 将用到的各个请求方式进行测试。
- 测试没有问题后,将index.php文件加密或者混淆。如何加密和混淆自行百度:https://blog.csdn.net/lorraine_40t/article/details/86569722
- 下载文件curl方法另行封装,先将内容写入本地服务器(A),再行下载。
- curl 抓取https方法的数据自行封装, 添加参数是否是https。
上代码:
<?php
$bUrl = 'http://XXX.com';
$rUrl = $_SERVER['REQUEST_URI'];
if ($rUrl == '/') {
$rUrl = 'admin/index/index';
header("location: {$_SERVER['REQUEST_SCHEME']}://{$_SERVER['HTTP_HOST']}/index.html");
}
$url = $bUrl . $rUrl;
$rMethod = $_SERVER['REQUEST_METHOD'];
$token = getHeader('token');
if (!empty($token)) { // 如果传值过来了token,将token存入
setcookie("token", "", time() - 1);
setcookie('token', $token, time() + 18000, "/");
$_COOKIE['token'] = $token;
} else { // 反之,从COOKIE读取
if (!empty($_COOKIE['token'])) {
$token = $_COOKIE['token'];
} else {
$token = null;
}
}
$json = file_get_contents('php://input');
if (!empty($json)) {
$rMethod = 'JSON';
}
$header[] = "token: {$token}";
// curl_setopt($ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
switch ($rMethod) {
case 'POST':
// $header[] = "Content-Type: application/text; charset=utf-8";
// 如果上传文件
$postData = $_POST;
if (!empty($_FILES)) {
$fileKey = array_keys($_FILES);
$realpath = realpath($_FILES[$fileKey[0]]['tmp_name']);
$postData[$fileKey[0]] = new CURLFile($realpath);
}
echo httpPostBody($url, $postData, $header);
die;
case 'GET':
$res = httpGet($url, $header);
$isFalse = json_encode($res);
if (false === $isFalse) {
$rootPath = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'origin' . DIRECTORY_SEPARATOR . date('Ymd');
if (!is_dir($rootPath)) {
mkdir($rootPath);
}
$fileName = time() . rand(1000, 9999) . '.xls';
$downloadPath = $rootPath . DIRECTORY_SEPARATOR . $fileName;
httpDownload($url, $downloadPath, $header);
// $u = "location: http://{$_SERVER['HTTP_HOST']}/origin/" . date('Ymd') . '/' . $fileName;
// echo $u;die;
header("location: {$_SERVER['REQUEST_SCHEME']}://{$_SERVER['HTTP_HOST']}/origin/" . date('Ymd') . '/' . $fileName);
} else {
echo $res;
}
die;
case 'JSON':
$header[] = "Content-Type: application/json; charset=utf-8";
$header[] = "Content-Length: " . strlen($json);
echo httpPostRaw($url, $json, $header);
die;
default:
die('非法访问');
}
function httpPostRaw($url, $jsonString, $header = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonString);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
ob_start();
curl_exec($ch);
$returnContent = ob_get_contents();
ob_end_clean();
// $returnCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return $returnContent;
}
function httpGet($url, $header = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function httpPostBody($url, $postData, $header = null)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
function httpDownload($url, $filePath, $header = null)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
$fp = fopen($filePath, 'w+');
curl_setopt($curl, CURLOPT_FILE, $fp);
//这个选项是意思是跳转,如果你访问的页面跳转到另一个页面,也会模拟访问。
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 50);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_exec($curl);
curl_close($curl);
fclose($fp);
}
function getHeader($name = '', $default = null)
{
$header = [];
if (function_exists('apache_request_headers') && $result = apache_request_headers()) {
$header = $result;
} else {
$server = $_SERVER;
foreach ($server as $key => $val) {
if (0 === strpos($key, 'HTTP_')) {
$key = str_replace('_', '-', strtolower(substr($key, 5)));
$header[$key] = $val;
}
}
if (isset($server['CONTENT_TYPE'])) {
$header['content-type'] = $server['CONTENT_TYPE'];
}
if (isset($server['CONTENT_LENGTH'])) {
$header['content-length'] = $server['CONTENT_LENGTH'];
}
}
$header = array_change_key_case($header);
if (is_array($name)) {
return array_merge($this->header, $name);
}
if ('' === $name) {
return $header;
}
$name = str_replace('_', '-', strtolower($name));
return isset($header[$name]) ? $header[$name] : $default;
}