2012-06-29 9 views
6

Per errori CakePHP so che esistono soluzioni CakeError e AppError. Ma ho bisogno di fare un reindirizzamento all'interno del controller.Reindirizzamento CakePHP con codice di stato 404

In AppController esiste:

function afterFilter() { 
    if ($this->response->statusCode() == '404') 
    { 
     $this->redirect(array(
      'controller' => 'mycontroller', 
      'action' => 'error', 404),404 
     ); 
    } 
} 

Ma questo non crea un codice di stato 404. Crea un codice 302. Ho cambiato il codice per questo:

$this->redirect('/mycontroller/error/404', 404); 

Ma il risultato è lo stesso.

ho aggiunto questo, non ha funzionato anche deprecato:

$this->header('http/1.0 404 not found'); 

Come posso inviare un codice 404 all'interno del controller reindirizzare?

risposta

17

Se si desidera restituire un errore 404, utilizzare il costruito nel supporto CakeError per esso:

throw new NotFoundException(); 

Si può buttare questa eccezione dal controller e dovrebbe generare una risposta 404.

Esistono più eccezioni integrate here.

Se si è interessati a creare una pagina di errore personalizzata, vedere this post.

In caso contrario, non penso sia possibile restituire un codice di intestazione 404 e continuare a reindirizzare. Http specifica i codici di stato di reindirizzamento su be in the 300s, e questa è la convenzione seguita da CakePHP.

3

Per qualche motivo l'uso di redirect() cambierà il codice di stato in 3xx. Se si desidera eseguire un'altra azione e ancora tornare 404, si può fare come segue:

$this->controller->response->statusCode(404); 
$this->controller->render('/mycontroller/error/404'); 
$this->controller->response->send(); 

Questo eseguirà myController :: errore (404) senza redirect.

-1

CakePHP 3

use Cake\Network\Exception\NotFoundException; 
... 
throw new NotFoundException(__('Article not found'));