uri_string() 返回空字符串最常见原因是请求未经过codeigniter路由机制,如直接访问静态资源、php文件绕过index.php,或nginx重写规则配置错误;它仅在ci请求生命周期内有效,本质是$this->uri->uri_string的快捷封装。

为什么 uri_string() 返回空字符串?
最常见原因是当前请求没走 CodeIgniter 的路由机制——比如直接访问静态资源、PHP 文件被绕过前端控制器(index.php),或用了 Nginx 且未正确配置重写规则。它只在 CI 的请求生命周期内有效,本质是读取 $this->uri->uri_string 的快捷封装。
- 确认入口文件是
index.php(或你自定义的入口),且所有请求都经它中转 - 检查 Web 服务器配置:Apache 需
.htaccess启用 mod_rewrite;Nginx 必须有类似try_files $uri $uri/ /index.php?$query_string;的 fallback - CLI 环境下
uri_string()永远为空——CI 不认为命令行有“URI”,别在这儿依赖它
uri_string() 和 current_url() 的区别在哪?
前者返回去除域名和查询参数的原始 URI 路径段(如 /admin/users/edit/123),后者拼出完整 URL(含协议、域名、路径、$_SERVER['QUERY_STRING'])。它们用途完全不同,混用会导致路由判断错乱或跳转异常。
-
uri_string()适合做路由匹配、权限校验、日志记录路径部分 -
current_url()只该用在生成分享链接、重定向回原页等需要完整地址的场景 - 注意:
current_url()会受$_SERVER['HTTP_HOST']和$_SERVER['HTTPS']影响,代理环境下若没设置trust_proxy或修正$_SERVER,可能生成 http://localhost 这类错误地址
在 Hooks 或 Libraries 里调用 uri_string() 报 “Undefined property: CI::$uri”?
说明 CI 核心对象尚未完全初始化,或者你手动 new 了一个类但没加载 URI 类。这不是函数本身的问题,而是执行时机或依赖管理失误。
- 确保在
post_controller_constructor及之后的 Hook 点使用,避免在pre_system中调用 - 如果在自定义 Library 中用,先检查是否已加载:
$this->load->library('uri');(虽然通常自动加载,但非标准加载方式可能漏掉) - 更稳妥的做法:改用
$this->router->directory . $this->router->class . '/' . $this->router->method拼接,它不依赖 URI 类,且更贴近实际路由结果
想获取带查询参数的 URI?别硬拼 uri_string() + $_SERVER['QUERY_STRING']
这样拼出来的不是标准 URI(缺少 ? 分隔符,且没处理空参数或编码问题),而且容易被 XSS 利用。CI 提供了更干净的替代方案。
- 用
uri_string() . ($_SERVER['QUERY_STRING'] ? '?' . $_SERVER['QUERY_STRING'] : '')是危险的——$_SERVER['QUERY_STRING']未经过滤,直接输出到 HTML 或重定向会引发漏洞 - 推荐改用
$this->input->server('QUERY_STRING'),它内部做了基础清理;再配合html_escape()输出,或urldecode()+rawurlencode()按需编码 - 如果只是要保留当前参数跳转,优先用
redirect($this->uri->uri_string(), 'refresh'),它天然安全,且兼容所有 CI 版本
真正要注意的是:URI 字符串在不同环境(CLI、API 请求、AJAX)下行为不一致,别把它当万能上下文标识。尤其做缓存键或权限判断时,得结合 $this->router->class 和 $this->router->method 才算稳。










