如何让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头的请求都不会被记录为上次访问地址,完全无需修改核心代码:
- 打开
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
相关产品推荐
相关产品推荐

