You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过DNS实现Synology NAS托管PHP网站的公网与本地双访问

公网/本地双访问PHP站点的两种实现方案

方案一:通过Split DNS(智能DNS)实现(推荐)

这种方式不需要修改代码,完全通过DNS解析逻辑让本地和公网访问自动适配:

  • 核心逻辑:让本地网络内的设备访问域名时解析到NAS的本地IP,公网设备访问时解析到NAS的公网IP
  • 具体操作:
    1. 启用Synology NAS自带的「DNS Server」套件,或者用家里路由器的自定义DNS功能
    2. 在本地DNS服务器中添加一条A记录,将你的域名(比如yourdomain.com)指向NAS的本地IP(比如192.168.1.100)
    3. 将家里所有设备的DNS地址设置为这个本地DNS服务器的IP
    4. 公网DNS依然保留GoDaddy的解析(指向你的公网IP)

这样设置后,不管本地还是公网访问,直接用域名即可,PHP的$_GLOBAL['URLROOT']固定设为域名(比如https://yourdomain.com),无需手动修改。

方案二:PHP代码自动切换URLROOT(快速实现)

你考虑的根据用户IP自动切换的方案完全可行,直接在代码里判断访问来源:

  • 核心逻辑:检测用户的IP是否属于本地内网网段,自动切换URLROOT的值
  • 代码示例:
// 定义常见的内网IP前缀
$local_ip_prefixes = [
    '192.168.',
    '10.',
    '172.16.', '172.17.', '172.18.', '172.19.', '172.20.',
    '172.21.', '172.22.', '172.23.', '172.24.', '172.25.',
    '172.26.', '172.27.', '172.28.', '172.29.', '172.30.', '172.31.'
];

// 获取用户真实IP
$user_ip = $_SERVER['REMOTE_ADDR'];
$is_local_access = false;

// 判断是否为本地访问
foreach ($local_ip_prefixes as $prefix) {
    // 兼容PHP 7及以下版本,用strpos判断前缀匹配
    if (strpos($user_ip, $prefix) === 0) {
        $is_local_access = true;
        break;
    }
}

// 自动设置URLROOT
$_GLOBAL['URLROOT'] = $is_local_access ? 'http://192.168.1.100' : 'https://yourdomain.com';
  • 注意事项:
    • 如果你的网站启用了HTTPS,要确保URLROOT里的协议(http/https)匹配
    • 若NAS在反向代理后,可能需要用$_SERVER['HTTP_X_FORWARDED_FOR']获取真实IP(需确认代理配置)

方案对比

  • Split DNS方案:无需改动代码,所有设备通过域名访问自动适配,体验更统一,适合长期使用
  • 代码切换方案:无需配置DNS,快速实现,适合临时需求或不想折腾网络设置的场景

内容的提问来源于stack exchange,提问作者Christopher Ansbaugh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:10:22