在 thinkphp 中,视图不能直接使用 $_server 变量获取当前网页完整路径,应由控制器通过 request 对象获取 fullurl()、url()、domain() 等信息后 assign 传递给视图使用,确保兼容性与安全性。

在 ThinkPHP 的视图(模板)里,不能直接用 PHP 的 $_SERVER 变量安全获取当前网页完整路径,因为框架已封装请求逻辑,且视图层应尽量避免耦合底层服务器变量。正确做法是在控制器中准备好所需路径信息,再传递给视图。
✅ 推荐方式:控制器传参 + 视图使用
在控制器中用 Request 对象获取路径信息,再 assign() 给模板:
use think\Request;
public function index()
{
$request = Request::instance();
// 完整 URL(含协议、域名、路径、查询参数)
$fullUrl = $request->fullUrl();
// 仅路径 + 查询字符串(如 /user/profile?id=123)
$urlPath = $request->url();
// 当前域名(自动适配 HTTP/HTTPS、端口)
$domain = $request->domain();
$this->assign('full_url', $fullUrl);
$this->assign('url_path', $urlPath);
$this->assign('domain', $domain);
return $this->fetch();
}
视图中直接使用:
<p>完整地址:{$full_url}</p>
<p>路径部分:{$url_path}</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站"><img
src="https://img.php.cn/upload/skill/000/000/081/179040786932301.jpg" alt="btpanel phpsite 宝塔面板PHP网站" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="overflowclass">btpanel phpsite 宝塔面板PHP网站</a>
<p class="overflowclass">宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理</p>
</div>
<a rel="nofollow" href="/xiazai/skill5233" title="btpanel phpsite 宝塔面板PHP网站" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<p>域名:{$domain}</p>
⚠️ 注意事项
-
Request::instance()->fullUrl()是最稳妥的完整 URL 获取方式,它自动拼接 scheme + host + path + query,不包含锚点(#xxx); -
Request::instance()->url()返回的是重写后的路径(如开启 URL 重写后为/user/list,而非/index.php?s=/user/list),适合做路径判断或菜单高亮; -
不要在视图里写
$_SERVER['REQUEST_URI']或$_SERVER['HTTP_HOST']—— 这些在 CLI、Swoole 或反向代理环境下可能为空或不准,且绕过框架请求对象,破坏一致性; - 如果部署在子目录(如
/myapp/),$request->root()可返回带子目录的根地址(需确保APP_URL配置正确或自动推导准确);
? 补充:视图中需要「当前页面路径」做判断时
比如高亮导航栏,可在控制器中提取关键路径段:
$pathInfo = $request->pathinfo(); // 如 'index/index/index'
$segments = explode('/', trim($pathInfo, '/'));
$this->assign('current_controller', $segments[0] ?? '');
$this->assign('current_action', $segments[1] ?? '');
模板中即可:
不复杂但容易忽略:路径信息必须由控制器准备,视图只负责展示和简单逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










