base_url用于静态资源路径,site_url用于控制器路由URL;前者拼接根地址与相对路径且不经过路由,后者生成带前缀的可路由URL;混用会导致404或安全风险。

base_url 指向网站根目录下的静态资源路径(比如 CSS、JS、图片),site_url 生成的是指向 CodeIgniter 控制器方法的可路由 URL,二者根本不在一个层级上,混用会导致链接 404 或绕过路由机制。
base_url 该用在哪儿?
它只负责拼接 base_url() 配置的根地址 + 你传入的相对路径,不经过路由解析,也不加 index.php。典型场景就是加载前端资源。
- 加载 CSS:
<link rel="stylesheet" href="= base_url('assets/css/app.css') ?>"> - 引入 JS:
<script src="= base_url('assets/js/main.js') ?>"></script> - 显示图片:
<img src="= base_url('uploads/avatar.jpg') ?>">
注意:base_url() 的参数必须是相对于 Web 根目录(即放置 index.php 的那个目录)的路径;如果写成 base_url('controllers/Some.php'),浏览器会直接暴露 PHP 文件——这是严重安全风险。
site_url 必须带控制器/方法名
site_url() 的作用是把「控制器类名/方法名」转成可访问的 URL,自动补上前缀(如 index.php 或重写后的干净路径),并遵守当前的 url_suffix 和 enable_query_strings 设置。
- 链接首页:
<a href="= site_url() ?>">Home</a>→/index.php或/ - 调用用户模块:
<a href="= site_url('user/profile') ?>">Profile</a>→/index.php/user/profile - 带参数:
site_url('post/view/123')生成带 URI 段的 URL,不是 query string
常见错误:传入物理路径(如 site_url('assets/js/app.js'))——这会让路由试图找叫 assets 的控制器,必然 404。
URL 生成失败的三个高频原因
不是函数写错了,而是环境或配置没对齐:
-
base_url()返回空?检查$config['base_url']是否为空或未在config.php中正确设置;CI 3.1.11+ 默认不再自动探测,必须手动填 -
site_url()生成的链接仍带index.php,但页面却 404?说明 Apache/Nginx 的重写规则没生效,或者$config['index_page'] = ''却没配伪静态 - 用 CLI 运行时
site_url()报错?因为 CLI 环境下没有 HTTP_HOST 和 REQUEST_URI,CI 无法构造完整 URL;此时应改用base_url()或硬编码
开发时怎么快速验证?
别靠猜,直接在视图里临时输出看看:
<?php
echo 'base_url(): ' . base_url('assets/css/') . "\n";
echo 'site_url("user"): ' . site_url('user') . "\n";
?>
观察输出是否符合预期,再比对服务器实际请求路径。特别注意:如果用了 CDN 或反向代理,base_url() 应该指向 CDN 域名,而不是本地路径;而 site_url() 依然走应用自身域名——这个分工不能颠倒。
最常被忽略的一点:base_url() 和 site_url() 的返回值默认不带尾部斜杠,但你的 $config['base_url'] 如果末尾多了 /,就会变成 //;这种细微拼写问题在线上环境极难排查。










