最稳的方式是组合使用系统常量 root 和 self__。__root 表示含协议、域名、端口、子目录的网站根url,__self__ 表示含入口文件和path_info的当前请求路径,二者相加即为绝对可访问完整url,由框架自动计算,兼容伪静态及各类部署环境。

最稳的方式是组合使用系统常量 __ROOT__ 和 __SELF__,不依赖 $_SERVER 变量或手动拼接,避免环境差异导致的协议、端口、子目录偏差。
为什么 __ROOT__ + __SELF__ 最可靠
ThinkPHP3.2 在初始化时已根据当前请求自动计算好这两个常量:
-
__ROOT__:表示网站根目录 URL(含协议、域名、端口、子目录),例如
https://example.com/subdir -
__SELF__:表示当前完整请求路径(不含域名,含入口文件和 PATH_INFO),例如
/subdir/index.php/Admin/User/edit/id/5
二者相加即为绝对可访问的完整 URL,且完全由框架内部逻辑生成,不受 Apache/Nginx 配置、反向代理、CLI 环境等干扰。
直接可用的写法
在模板或控制器中直接使用:
<?php echo __ROOT__ . __SELF__; ?>
或在 PHP 逻辑中构造链接:
$fullUrl = __ROOT__ . __SELF__;
该值天然兼容伪静态开启/关闭状态——伪静态时 __SELF__ 仍是解析后的标准路径(如 /Admin/User/edit/id/5),__ROOT__ 会自动适配重写后的真实访问上下文。
不推荐的常见替代方式
- 拼接
$_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']:在 CLI、Nginx+FastCGI、HTTPS 反代等场景下,$_SERVER字段可能缺失、错误或被污染 - 用
U()函数:它生成的是相对路由地址(如/Home/Index/index),不是完整 URL,需再补前缀,易出错 - 硬编码域名或协议:无法适配多环境(开发/测试/生产)、多子目录部署、HTTPS 自动跳转等实际需求
特殊场景补充说明
若需排除 GET 参数(仅路径部分),可用 __APP__ + __INFO__:
-
__APP__ 是入口文件地址(如
/subdir/index.php) -
__INFO__ 是当前 PATH_INFO 字符串(如
/Admin/User/edit/id/5) - 组合为
__ROOT__ . __APP__ . __INFO__,适合生成无查询参数的标准操作路径
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











