2012-06-29 12 views
6

Błędy CakePHP Wiem, że istnieją rozwiązania CakeError i AppError. Ale muszę wykonać przekierowanie w kontrolerze.Przekierowanie CakePHP z kodem statusu 404

W AppController istnieje:

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

Ale to nie tworzy kod stanu 404. Tworzy kod 302. Zmieniłem kod do tego:

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

ale wynik jest taki sam.

dodałem to, że nie działa również przestarzałe:

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

Jak mogę wysłać kod 404 z kontrolerem przekierować?

Odpowiedz

17

Jeśli chcesz zwrócić błąd 404, użyj wbudowanego wsparcia CakeError do niego:

throw new NotFoundException(); 

Możesz rzucić ten wyjątek od kontrolera i powinny generować odpowiedź 404.

Istnieje więcej wbudowanych wyjątków here.

Jeśli jesteś zainteresowany zrobieniem niestandardowej strony błędu, zobacz this post.

W przeciwnym razie nie wydaje mi się, aby można było zwrócić kod 404 nagłówka i nadal przekierowywać. Http określa przekierowanie kodów statusu na be in the 300s, a jest to konwencja podążająca za CakePHP.

3

Z jakiegoś powodu użycie przekierowania() spowoduje zmianę kodu statusu na 3xx. Jeśli chcesz wykonać kolejną akcję i nadal powrotu 404, można to zrobić w następujący sposób:

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

ten będzie wykonywał MyController :: błąd (404) bez przekierowania.

-1

CakePHP 3

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