需求場景:需要在服務器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
上代碼:
<?php
$bUrl = 'local.plam.fudacoldchain.cn';
$rUrl = $_SERVER['REQUEST_URI'];
if ($rUrl == '/') {
$rUrl = 'admin/index/index';
// var_dump($_SERVER['HTTP_HOST']);die;
header("location: http://{$_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";
echo httpPostBody($url, $_POST, $header);
die;
case 'GET':
echo httpGet($url, $header);
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 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;
}