Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

CakePHP redirect with status code 404

For CakePHP errors I know that there exists CakeError and AppError solutions. But I need to make a redirection within controller.

In AppController there exists:

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

But this doesn't create a 404 status code. It creates a 302 code. I changed code to this:

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

But the result is same.

I added this, it didn't work also deprecated:

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

How can I send a 404 code within controller redirect ?

like image 869
trante Avatar asked Jun 29 '12 20:06

trante


2 Answers

If you want to return a 404 error, use the built in CakeError support for it:

throw new NotFoundException();

You can throw this exception from your controller and it should generate a 404 response.

There are more built-in exceptions here.

If you are interested in making a custom error page, then see this post.

Otherwise, I don't think it is possible to return a 404 header code and still redirect. Http specifies redirect status codes to be in the 300s, and this is the convention CakePHP follows.

like image 162
swiecki Avatar answered Nov 06 '22 04:11

swiecki


For some reason using redirect() will change the status code to 3xx. If you want to execute another action and still return 404, you can do as follows:

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

This will execute Mycontroller::error(404) without redirect.

like image 30
Giuppe Avatar answered Nov 06 '22 05:11

Giuppe