利用PHP一步解决NAS的Heimdall导航页的内外网切换以及Openwrt等其他局域网ip的跳转

, Read in about 4 min

Posted by Ryen on Tuesday, August 9, 2022
With final update in December 26,2023

本文总阅读量

Github项目地址:linuxserver/Heimdall: An Application dashboard and launcher (github.com)

Docker项目地址:linuxserver/heimdall - Docker Image | Docker Hub

自动识别内外网,以及自定义跳转方式

一、前提未安装Heimdall

本文不提供Heimdall的安装

但是得在安装过程中,添加一个目录挂载,不然安装后本地目录看不见这个目录

二、目录挂载

除了原本会映射出来的config文件夹,另一个先决条件得映射出Heimdall容器的另一个前端目录

2.1 挂载目录

2.1.1 群晖等NAS设备

修改容器的存储空间选项,选择添加的挂载文件夹

本地目录:随意

容器内目录:/var/www/localhost/heimdall/public

2.1.2 portainer

挂载的目录,挂载方式为bind

目录参考群晖的填写

2.1.3 docker代码行

部分人需要自定义网络或其他映射,剩余的请参考官方文档

docker run -v 本地目录 /var/www/localhost/heimdall/public -name Heimdall .....................................剩余参考官方文档

三、添加PHP文件

在映射的public本地目录中新建 zhuan.php,这文件命名你随意,只是在填写Heimdall跳转地址的时候需要修改为这个php

代码就不使用外链了,以防文件丢失

本人php并不专业,仅仅实现了这个小需求,代码苛刻的大牛要是批评我………….我也不会听

我学C的!我不管!

代码如下:(需自行修改前几行)

<?php
$local_host = '192.168.1'; //本地网段
$host_ip='192.168.1.211'; // heimdall本地ip
$openwrt_ip='192.168.1.118'; // openwrt本地ip
$frp_ip='**********'; // 内网穿透的ip,部分转换不支持域名(例如edge强制域名https,而部分服务不支持SSL)
$frp_domain='*****.***prlrr.com'; // 内网穿透的域名


// heimdall 内外网切换参数填写为:             zhuan.php?lan=:内网端口&wan=:内网穿透外网端口&keyword=heimdall (SSL需要配置证书以及wan需要是https的端口)
// heimdall 不同的局域网openwrt填写为:        zhuan.php?lan=:内网端口&wan=:内网穿透外网端口&keyword=openwrt
// heimdall 当前ip的不同端口服务参数填写为:   zhuan.php?lan=:内网端口&wan=:内网穿透外网端口

//获取当前的域以及端口
$host = isset($_SERVER['HTTP_X_FORWARDED_HOST']) ? $_SERVER['HTTP_X_FORWARDED_HOST'] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']);
//截出仅仅域名或IP部分,不包括端口
$temp = strstr ($host, ':', true);
// echo "####host:".$host."####";
// echo "####temp:".$temp."####";

if(strpos($temp,$local_host) !== false){ 

    // echo '当前属于局域网'; 

    if (isset($_GET["lan"]))//判断所需要的参数是否存在,isset用来检测变量是否设置,返回true or false
    {  
            if(isset($_GET["keyword"])){

                //判断是否包含关键字heimdall,切换到外网的heimdall
                if($_GET["keyword"]=="heimdall"){
                    $url="http://".$frp_domain.$_GET["wan"];

                    // echo "heimdall";
                    // echo "####url:".$url."####";

                //判断是否包含关键字openwrt,切换到其他局域网的openwrt
                }elseif($_GET["keyword"]=="openwrt"){
                    $url="http://".$openwrt_ip.$_GET["lan"];

                    // echo "openwrt";
                    // echo "####url:".$url."####";
                }else{
                    header("http/1.1 404 not found");
                    exit();
                }

            }else{
                //判断当前截取的$temp域名是否存在,不存在就使用浏览器自动获取的$host,加上事先设定的lan口的端口
                $url = "http://".($temp?$temp:$host).$_GET["lan"];  
                // echo "####url:".$url."####";
            }
    }else{
        header("http/1.1 404 not found");
                    exit();
    }

    header("Location: $url");
    exit();

}else{
        // echo '当前属于外网'; 

        if (isset($_GET["wan"]))//判断所需要的参数是否存在,isset用来检测变量是否设置,返回true or false
        {  
                    if(isset($_GET["keyword"])){

                        //判断是否包含关键字heimdall,切换到内网的heimdall
                        if($_GET["keyword"]=="heimdall"){
                            $url="http://".$host_ip.$_GET["lan"];

                            // echo "heimdall";
                            // echo "####url:".$url."####";

                        //判断是否包含关键字openwrt,切换到外网的openwrt
                        }elseif($_GET["keyword"]=="openwrt"){
                            $url="http://".$frp_ip.$_GET["wan"];

                            // echo "openwrt";
                            // echo "####url:".$url."####";
                        }else{
                            header("http/1.1 404 not found");
                            exit();
                        }

                    }else{
                        //判断当前截取的$temp域名是否存在,不存在就使用浏览器自动获取的$host,当前属于外网,就加上事先设定的wan口的端口
                        $url = "http://".($temp?$temp:$host).$_GET["wan"];  
                        // echo "####url:".$url."####";
                    }
        }else{
                header("http/1.1 404 not found");
                            exit();
            }
            header("Location: $url");
            exit();
   }

header("http/1.1 404 not found");
header("status: 404 not found");
//echo 'echo 404';//直接输出页面错误信息
header('location: /404.html');
exit();

?>

四、效果预览以及填写格式

如图:

「真诚赞赏,手留余香」

Ryen's Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付