CodeIgniter 控制器被调用两次

Posted

技术标签:

【中文标题】CodeIgniter 控制器被调用两次【英文标题】:CodeIgniter controllers being called twice 【发布时间】:2011-03-31 18:45:09 【问题描述】:

我完全有可能在某个地方犯了一个大错误,但由于某种原因,我的控制器被调用了两次。这打破了 DX_Auth 在 Chrome 上的验证码,但不知何故,Firefox 和 IE 可以处理它。

问题是,每个控制器的调用时间间隔为 2 毫秒。我使用 log_message() 从 $_SERVER 超全局打印每个键/值对。

唯一的区别是:

第一次调用

'HTTP_CACHE_CONTROL' => 'max-age=0'
'HTTP_ACCEPT' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5'
'HTTP_COOKIE' => 'ci_session=a:4:s:10:"session_id";s:32:"4be9cef4e2cdae468c7443f52a5fb3f2";s:10:"ip_address";s:13:"321.321.321.321";s:10:"user_agent";s:50:"Mozilla/5.0+(Windows;+U;+Windows+NT+6.1;+en-US)+Ap";s:13:"last_activity";s:10:"1282151409";70b300096c8d40c60a676ac65bcb222c'
'REMOTE_PORT' => '61828'

和第二次通话

'HTTP_CACHE_CONTROL' => NULL
'HTTP_ACCEPT' => '*/*'
'HTTP_COOKIE' => 'ci_session=a:4:s:10:"session_id";s:32:"a5bb2c98a8ff4438cef3a3fe3d5ff73e";s:10:"ip_address";s:13:"321.321.321.321";s:10:"user_agent";s:50:"Mozilla/5.0+(Windows;+U;+Windows+NT+6.1;+en-US)+Ap";s:13:"last_activity";s:10:"1282151734";4adf1de21f9708d66b3d4bc36d0b0d92'
'REMOTE_PORT' => '61842'

CI 论坛上已经有一个帖子,其他人遇到了类似的问题,但他的问题原来是间谍软件。这不是我的情况。我尝试了几台电脑,但我的访问者都无法注册该网站。

您会看到,DX_auth 在第一次调用时将验证码的值存储为 CI 会话 flashdata。第二次调用会擦除 flashdata,因此没有人能够正确地获取验证码。

这是我的访问日志示例

123.123.123.123 - - [18/Aug/2010:12:31:26 -0500] "GET /welcome HTTP/1.1" 200 3391 "http://somewhere.com/[age" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4"
123.123.123.123 - - [18/Aug/2010:12:31:27 -0500] "GET /welcome HTTP/1.1" 200 3391 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.126 Safari/533.4"

如您所见,第一个电话似乎来自我,而第二个电话没有推荐人。

我认为我用来从 uri 中删除 index.php 的 .htaccess 文件有问题。因此,我切换到 CI 文档中所述的“默认”.htaccess 重定向。双重加载仍然发生。

RewriteEngine on
RewriteCond $1 !^(index\.php|asset|captcha|robots\.txt|favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]

我还使用了 FireFox 的“Live HTTP headers”插件。看起来只发送了一个请求,但 FireBug 的控制台显示返回了两个回复。

有人知道发生了什么吗?其他人也遇到过这种情况吗?

【问题讨论】:

你下面所有的cmets都是有帮助的,我相信它们都是CI双重加载的例子。但是,我解决了我自己的问题。问题是,我正在使用 php 变量填充快捷方式图标元标记。 在调用视图之前,我不小心在控制器类中未初始化 $s_icon。浏览器正在搜索一个图标,并将“”解释为相对链接。因此,浏览器第二次调用 index.php。所以教训是,图像或包含的任何 src 标记保留为 "" 都会导致 CI​​ 双重拉取。 检查您是否在使用 adblock 插件。我有同样的问题,当我停止插件时,问题解决了。 【参考方案1】:

请参阅我对类似问题的回复,以了解可能导致此问题的原因以及如何开始确定确切的问题:Controller actions being called twice --- Php application

【讨论】:

我自己想通了,但是,您链接到的线程列出了一些常见问题和解决方案。我的问题是该问题的作者列出的问题之一。所以,我想这是最好的答案。【参考方案2】:

我遇到了同样的问题,这让我发疯。 该请求实际上来自Firefox。 Firefox 浏览器发送请求两次。 所以这不是codeigniter的错误。尝试使用其他版本的 Firefox。应该可以解决问题了。

【讨论】:

【参考方案3】:

当基于响应在 DOM 元素上使用 jQuery 绑定事件时,我遇到了类似这样的行为,并且忘记了您需要取消绑定该 DOM 元素上的旧事件。

【讨论】:

【参考方案4】:

我的问题是这个,并且页面正在这个元标记上重新加载。删除它,Firefox 双重加载停止。

<meta http-equiv="Content-Type" content="text/css; charset=utf-8" />

【讨论】:

以上是关于CodeIgniter 控制器被调用两次的主要内容,如果未能解决你的问题,请参考以下文章

出现致命错误 CodeIgniter CI_Controller not found

Firebase 身份验证被调用两次

ViewWillAppear 被调用两次

PHP CodeIgniter 加载视图问题,加载完整路径两次

viewWillDisappear 被调用两次

UnitTest一个调用模型的PHP CodeIgniter控制器