83 lines
2.3 KiB
PHP
83 lines
2.3 KiB
PHP
<?php defined('SYSPATH') or die('No direct access allowed.');
|
|
|
|
/**
|
|
* This class overrides Kohana's 404 Exception
|
|
*
|
|
* @package Redir/Modifications
|
|
* @category Classes
|
|
* @author Deon George
|
|
* @copyright (c) 2010-2013 Deon George
|
|
* @license http://dev.leenooks.net/license.html
|
|
*/
|
|
class HTTP_Exception_404 extends Kohana_HTTP_Exception_404 {
|
|
/**
|
|
* Before returning our file not found, lets see if we are redirecting this URI
|
|
*/
|
|
public function get_response() {
|
|
try {
|
|
// Try and find the path
|
|
$ro = ORM::factory('Redir',array('servername'=>$_SERVER['SERVER_NAME'],'path'=>$this->request()->uri()));
|
|
|
|
if (! $ro->loaded()) {
|
|
$ro = ORM::factory('Redir',array('servername'=>$_SERVER['SERVER_NAME'],'path'=>NULL));
|
|
|
|
if (! $ro->loaded())
|
|
$ro = ORM::factory('Redir',0);
|
|
}
|
|
|
|
$ro->count++;
|
|
$ro->date_last_refer = time();
|
|
$ro->save();
|
|
|
|
// Update our referrer info
|
|
$rfo = $ro->referrer->where('referrer','=',$this->request()->referrer())->find();
|
|
|
|
if (! $rfo->loaded()) {
|
|
$rfo->redir_id = $ro->id;
|
|
$rfo->referrer = $this->request()->referrer();
|
|
}
|
|
|
|
$rfo->count++;
|
|
$rfo->date_last_refer = $ro->date_last_refer;
|
|
$rfo->save();
|
|
|
|
// Prepare the response object.
|
|
$response = Response::factory();
|
|
|
|
// Process our redirection options
|
|
if (preg_match('/^http[s]?:\/\//',$ro->redirect)) {
|
|
$response->status(302);
|
|
$response->headers('Location',$ro->redirect);
|
|
|
|
} elseif (preg_match('/^file:\/\/(.*)$/',$ro->redirect,$matches) AND file_exists($matches[1])) {
|
|
$response->status(200);
|
|
$response->body(file_get_contents($matches[1]));
|
|
|
|
HTTP::check_cache($this->request(),$response,sha1($response->body()));
|
|
|
|
$response->headers('Content-Type',File::mime_by_ext(pathinfo($matches[1],PATHINFO_EXTENSION)));
|
|
$response->headers('Content-Length',(string)$response->content_length());
|
|
$response->headers('Last-Modified',date('r',$matches[1] ? filemtime($matches[1]) : time()));
|
|
|
|
} else {
|
|
$response->status(404);
|
|
$response->body(View::factory('404'));
|
|
|
|
HTTP::check_cache($this->request(),$response,sha1($response->body()));
|
|
}
|
|
|
|
return $response;
|
|
|
|
} catch (Exception $e) {
|
|
// Incase we are thrown in this exception.
|
|
if ($e instanceof HTTP_Exception AND $e->getCode() != 404) {
|
|
$x = new $e;
|
|
return $x->get_response();
|
|
}
|
|
|
|
return parent::get_response();
|
|
}
|
|
}
|
|
}
|
|
?>
|