如何通过DNS实现Synology NAS托管PHP网站的公网与本地双访问
公网/本地双访问PHP站点的两种实现方案
方案一:通过Split DNS(智能DNS)实现(推荐)
这种方式不需要修改代码,完全通过DNS解析逻辑让本地和公网访问自动适配:
- 核心逻辑:让本地网络内的设备访问域名时解析到NAS的本地IP,公网设备访问时解析到NAS的公网IP
- 具体操作:
- 启用Synology NAS自带的「DNS Server」套件,或者用家里路由器的自定义DNS功能
- 在本地DNS服务器中添加一条A记录,将你的域名(比如
yourdomain.com)指向NAS的本地IP(比如192.168.1.100) - 将家里所有设备的DNS地址设置为这个本地DNS服务器的IP
- 公网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
相关产品推荐
相关产品推荐

