最近使用Ward搭建了一个服务器状态监控的面板,非常的好看

Ward

由于本站是直接搭建在本地的物理服务器上的,并且使用了内网穿透的方式大家才能访问,而Ward是用docker跑起来的,映射了本地服务器的4000端口,每次想添加一个域名映射到服务器上需要单独新建一个隧道,由于本人巨懒,所以就不想新建隧道了,打算直接用反向代理的方式直接将Ward映射到子目录:ELEC Server (kezez.com),于是就搜索了一下有没有php直接反向代理的方式,结果还真的被我找到了,本文的实现方式采用了Mayx博主的方法,原文链接:如何用PHP制作一个简单的反向代理 | Mayx的博客 (mabbs.github.io)

实现方式

首先,创建一个子目录:/lab/status/, 这样可以直接通过这个链接访问:https://www.kezez.com/lab/status/
然后在子目录创建一个index.php文件,内容如下:

<?php

function removePrefixIfStartsWith($str, $prefix) {
    // 检查字符串是否以指定前缀开头
    if (strpos($str, $prefix) === 0) {
        // 如果是,则删除前缀并返回新的字符串
        return substr($str, strlen($prefix));
    } else {
        // 如果不是则直接返回原字符串
        return $str;
    }
}

$string = $_SERVER['REQUEST_URI'];

$outputString = removePrefixIfStartsWith($string, "/lab/status");

$content = file_get_contents("http://192.168.0.2:4000".$outputString);

foreach ($http_response_header as $header) {
    header($header);
}
if ($content) {
    echo $content;
}
else
{
    echo "404";  
}

这个时候,简易的反代已经创建好了,接下来需要将/lab/status/路径下的所有请求转发到index.php来处理,由于目前本站是直接用的typecho的apache docker镜像,环境是基于apache的,所以直接在同级目录创建一个.htaccess文件,并写下如下内容:

RewriteEngine On
RewriteBase /lab/status

# 重写规则:如果请求的文件或目录实际不存在,则重定向到index.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]

此时就大工告成了,具体效果可以直接查看:ELEC Server (kezez.com)

PS:
如果使用此方式,建议将被反向代理的网站引用的资源链接改成相对路径,否则可能不显示样式

参考

如何用PHP制作一个简单的反向代理 | Mayx的博客 (mabbs.github.io)

如果觉得我的文章对你有用,请随意赞赏