要生成带完整域名的链接,必须正确配置$config['base_url']为以协议开头且结尾带斜杠的URL,并用base_url()与site_url()拼接;anchor()不支持协议绝对路径,第三参数仅为HTML属性。

url_helper 默认生成的是相对路径链接,比如 anchor('user/login', '登录') 输出的是 <a href="user/login">登录</a>。要让它生成带完整域名(如 https://example.com/user/login)的链接,必须显式启用「协议绝对 URL」支持,并确保配置项正确。
确认 $config['base_url'] 已正确设置
这是最关键的前置条件。如果 base_url() 返回空或错误路径,site_url() 和 anchor() 都无法推导出有效域名。
-
$config['base_url']必须以协议开头,且结尾带斜杠,例如:$config['base_url'] = 'https://example.com/'; - 不要写成
'/'、'http://'或漏掉末尾/,否则site_url()会拼接出类似https://example.comuser/login的错误路径 - 该配置位于
application/config/config.php,不是routes.php或其他文件
用 site_url() + base_url() 组合构造带域名链接
site_url() 本身不带协议和域名,但它依赖 base_url();而 base_url() 是唯一能输出完整域名的辅助函数。所以常规做法是手动拼接:
// 正确:拼出完整 URL
<a href="<?php echo base_url() . site_url('user/login'); ?>">登录</a>
// 或封装成小工具(非官方,但实用)
function full_url($uri) {
return base_url() . site_url($uri);
}
echo anchor(full_url('user/login'), '登录');
- 注意:不能直接对
site_url()的结果再套base_url(),因为site_url('user/login')返回的是index.php/user/login(含 index.php),而base_url()已含域名,拼起来就是双重复路径 - 如果你已通过 .htaccess 移除了
index.php,那site_url()输出的仍是index.php/xxx—— 这是 CodeIgniter 3 的默认行为,与重写规则无关;要关闭它,需设$config['index_page'] = '';
避免误用 anchor() 的第 3 个参数
anchor() 第三个参数是 HTML 属性数组,**不是 URL 前缀**。下面这种写法无效:
// ❌ 错误:$attributes 不会改变链接地址
echo anchor('user/login', '登录', ['href' => base_url().'user/login']);
// ✅ 正确:用 base_url() 拼字符串,或改用 url_title() + base_url()
echo '<a href="' . base_url() . 'user/login">登录</a>';
- 有人试图传入
['protocol' => 'https'],但anchor()完全不识别这个键 —— 它只处理class、id、target等标准 HTML 属性 - 若你大量需要带域名的链接,建议在控制器里提前拼好传给视图,而不是在视图里反复调用
base_url()和site_url()
真正容易被忽略的点是:base_url() 和 site_url() 的职责边界非常清晰 —— 前者管静态资源根路径(含域名),后者管路由入口(含 index.php 或重写后路径)。强行让 url_helper “自己生成带域名链接”不符合它的设计意图,硬改只会引入不可控的字符串拼接逻辑。


















