简体   繁体   中英

Why/Where does CodeIgniter set a 404 http status when the page is found?

I am using CodeIgniter2. I am using routing to route url segments to a controller and method.

This seems to work. My pages load as expected ie the url goes to the correct method to get the page info from the database, come back and display the correct page. My routes.php relevant code is:

$route['default_controller'] = "content";
$route['en/(:num)/(:any)'] = "content/en/$1";
$route['de/(:num)/(:any)'] = "content/de/$1";
$route['es/(:num)/(:any)'] = "content/es/$1";
$route['it/(:num)/(:any)'] = "content/it/$1";
$route['ar/(:num)/(:any)'] = "content/ar/$1";
$route['404_override'] = '';

HOWEVER instead of that displayed page showing a http status of 200, it shows a http status of 404 ... I have no idea why.

I suspect it is to do with a MY_Router.php file i have to give a custom error page but i can't work out what's going on.

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Router extends CI_Router {

    var $error_controller = 'error';
    var $error_method_404 = 'error_404';

    function My_Router()
    {
        parent::CI_Router();
    }

    // this is just the same method as in Router.php, with show_404() replaced by $this->error_404();
    function _validate_request($segments)
    {
        // Does the requested controller exist in the root folder?
        if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
        {
            return $segments;
        }

        // Is the controller in a sub-folder?
        if (is_dir(APPPATH.'controllers/'.$segments[0]))
        {       
            // Set the directory and remove it from the segment array
            $this->set_directory($segments[0]);
            $segments = array_slice($segments, 1);

            if (count($segments) > 0)
            {
                // Does the requested controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
                {
                    return $this->error_404();
                }
            }
            else
            {
                $this->set_class($this->default_controller);
                $this->set_method('index');

                // Does the default controller exist in the sub-folder?
                if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
                {
                    $this->directory = '';
                    return array();
                }
            }

            return $segments;
        }

        // Can't find the requested controller...
        return $this->error_404();
    }

    function error_404()
    {
        $this->directory = "";
        $segments = array();
        $segments[] = $this->error_controller;
        $segments[] = $this->error_method_404;
        return $segments;
    }

    function fetch_class()
    {
        // if method doesn't exist in class, change
        // class to error and method to error_404
        $this->check_method();

        return $this->class;
    }

    function check_method()
    {
        $ignore_remap = true;

        $class = $this->class;
        if (class_exists($class))
        {   
            // methods for this class
            $class_methods = array_map('strtolower', get_class_methods($class));

            // ignore controllers using _remap()
            if($ignore_remap && in_array('_remap', $class_methods))
            {
                return;
            }

            if (! in_array(strtolower($this->method), $class_methods))
            {
                $this->directory = "";
                $this->class = $this->error_controller;
                $this->method = $this->error_method_404;
                include(APPPATH.'controllers/'.$this->fetch_directory().$this->error_controller.EXT);
            }
        }
    }

    function show_404()
    {
        include(APPPATH.'controllers/'.$this->fetch_directory().$this->error_controller.EXT);
        call_user_func(array($this->error_controller, $this->error_method_404));
    }

}

/* End of file MY_Router.php */
/* Location: ./system/application/libraries/MY_Router.php */

Solved - the wordpress blog integrated in the site was setting the 404 status for all non wordpress pages ie codeigniter pages

index.php of CI had the following code which needed to be commented out

/*
 *---------------------------------------------------------------
 * WORDPRESS INTEGRATION
 *---------------------------------------------------------------
 * The ci_site_url function helps to avoid collision between WP & CI.
 */

 //header("HTTP/1.0 200 OK");

 define('WP_USE_THEMES', false);
 require_once './blog/wp-blog-header.php';

 add_filter('site_url', 'ci_site_url', 1);

    function ci_site_url()
    {
  include(APPPATH.'/config/config.php');
  return $config['base_url'];
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM