You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Codeigniter控制器方法不被previous_url()识别记录

问题根源

CodeIgniter默认会将所有正常GET请求的地址存入session作为previous_url,你动态生成JS的请求属于GET请求,会覆盖真实的页面访问地址。以下是无需修改核心代码的解决方案:


方案1:控制器内直接保留原有上次地址(改动最小,仅针对当前场景)

在你生成动态JS的控制器方法中,提前暂存当前已有的previous_url,待逻辑执行完成后重新写入session,避免被当前JS请求地址覆盖:

public function generateDynamicJs()
{
    // 暂存当前已有的上次访问地址
    $originalPrevUrl = session()->get('previous_url');

    // 你的原有JS生成逻辑
    $data = '// 动态生成的JS内容';
    
    $response = $this->response
        ->setBody($data)
        ->setHeader('Content-Type', 'text/javascript')
        ->noCache();

    // 把原有上次地址写回session,覆盖系统后续自动写入的JS请求地址
    if ($originalPrevUrl) {
        session()->set('previous_url', $originalPrevUrl);
    }

    return $response;
}

方案2:全局过滤规则适配所有同类资源请求(通用性更强)

通过CI内置的事件机制重写URL存储逻辑,所有返回JS类型、带no-cache头的请求都不会被记录为上次访问地址,完全无需修改核心代码:

  1. 打开app/Config/Events.php,添加如下事件监听:
// 覆盖系统默认的previous_url存储逻辑
Events::off('post_system', [\CodeIgniter\CodeIgniter::class, 'storePreviousURL']);
Events::on('post_system', function () {
    $request = service('request');
    $response = service('response');

    // 新增过滤规则:JS类型响应、带no-cache/no-store头的请求不记录
    $contentType = $response->getHeaderLine('Content-Type');
    $cacheControl = $response->getHeaderLine('Cache-Control');
    if (
        str_contains($contentType, 'text/javascript')
        || str_contains($cacheControl, 'no-cache')
        || str_contains($cacheControl, 'no-store')
    ) {
        return;
    }

    // 其他请求正常执行原有存储逻辑
    \CodeIgniter\CodeIgniter::storePreviousURL();
});

这个方案完全复用了你之前修改核心的逻辑,但通过事件机制实现,后续CI版本升级也不会受影响。


内容的提问来源于stack exchange,提问作者3m1n3nc3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 05:54:01