我有一个名为Traffic的库,我需要记录用户访问时使用它。我在autoload配置文件中自动加载它,但只在需要时调用方法函数。
class Traffic {
function monitor()
{
$CI=& get_instance();
$ip = $CI->input->ip_address();
$input = array( 'ip' => $ip);
$CI->db->insert('traffic', $input);
}
}
我称之为
class Post extends CI_Controller {
function __construct()
{
parent::__construct();
}
public function index()
{
$this->traffic->monitor();
$this->load->view('post_view');
}
}
这是post_view.php
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<img src="http://sample.com/photo/img_2133.jpg" />
</body>
</html>
问题是,如果无法找到页面中的图像(已删除),则插入将发生两次。看起来像流量类的404错误方法monitor()。即使我没有要求它这样做。
因此,如果帖子视图页面有10个图像,并且所有图像都已删除或不存在,那么我的流量表将有11个新记录。 1表示我在控制器中调用的内容,10表示404错误。
如何停止404错误自动调用monitor方法。 404错误到底怎么可以访问我的库?
更新:
我的htaccess
#this code redirect site to non www address then remove index.php from url
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteCond $1 !^(index\.php|resources|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]
我的routes.php
$route['default_controller'] = "home";
$route['404_override'] = 'my404';
$route['(login|post)'] = "$1";
$route['(login|post)/(:any)'] = "$1/$2";
$route['(:any)'] = "post/index/$1";
答案 0 :(得分:1)
问题出在路由范围内。我们来看一下图片网址photos/image.jpg
的例子。
首先,根据 .htaccess 中的规则,URL(与现有文件不匹配)更改为index.php/photos/image.jpg
。
其次,根据规则(:any)
,网址更改为post/index/photos/image.jpg
,这是指 Post 控制器的索引方法。因此,每个删除的图像都会导致插入traffic
表。
解决方案是过滤 photos 目录中的请求,并使服务器为已停止的图像抛出真正的404 HTTP错误。例如,您可以通过将照片目录添加到 .htaccess 规则来实现此目的:
RewriteCond $1 !^(index\.php|resources|photos|robots\.txt)