2016-04-13 8 views
0

Ich verwende CodeIgniter2. Ich verwende Routing, um URL-Segmente an einen Controller und eine Methode zu leiten.Warum/Wo setzt CodeIgniter einen 404 http-Status, wenn die Seite gefunden wird?

Dies scheint zu funktionieren. Meine Seiten werden wie erwartet geladen, d. H. Die URL geht zur richtigen Methode, um die Seiteninformationen aus der Datenbank abzurufen, zurück zu kommen und die richtige Seite anzuzeigen. Mein routes.php entsprechender Code ist:

$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'] = ''; 

JEDOCH statt, dass angezeigte Seite einen HTTP-Status von 200 zeigt, zeigt es einen HTTP-Status von 404 ... Ich habe keine Ahnung, warum.

Ich vermute, es ist mit einer MY_Router.php-Datei zu tun, ich muss eine benutzerdefinierte Fehlerseite geben, aber ich kann nicht herausfinden, was vor sich geht.

<?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 */ 
+0

Nicht sicher, ob es verwandt ist, aber Code von 'MY_Router' gehört zu CI <= 1.7 Version. – Tpojka

+0

Danke Tpojka - woher weißt du das und weißt du, wo ich eine aktualisierte Version bekommen kann? könnte funktionieren, vielleicht nicht! Danke –

+0

Wegen der Syntax. Vor Jahren wurden Eigenschaften mit 'var' deklariert. Sie können dies bei der Sichtbarkeitserklärung weglassen (überprüfen Sie [hier] (http://php.net/manual/en/language.oop5.properties.php)). Die zweite Sache ist Konstruktor. Es sollte "public function __construct() { parent :: __ construct();}' sein. PHP [Dokumente] (http://php.net/manual/en/language.oop5.decon.php). Ändern Sie das für den Anfang. – Tpojka

Antwort

0

gelöst - das Wordpress-Blog in der Seite integriert wurde die Einstellung des 404-Status für alle nicht Wordpress-Seiten, dh codeigniter Seiten

index.php von CI hatten den folgenden Code, das kommentiert werden mußte aus

/* 
*--------------------------------------------------------------- 
* 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']; 
    }