2009-06-03 3 views
1

Этот вопрос немного связан с моей старой должностью Dealing with Alias URLs in CakePHPМогу ли я сделать CakePHP подходящим кодом состояния на основе определенных условий?

После долгих раздумий, я исследую возможность иметь сценарий 404 в моем Cake App, что достигается, когда URL не отображает какие-либо контроллеры/действия , Этот скрипт будет проверять здесь $ this-> и искать его в базе данных перенаправления. Если совпадение найдено, оно будет отслеживать конкретный код «promo» и перенаправлять.

Я думаю коды состояния. Могу ли я заставить свой скрипт возвращать подходящий код состояния на основе определенных условий? Например:

  1. URL совпадает с переадресацией - возвращает 301
  2. URL действительно не пункт назначения - возвращать 404.

Могу ли я сделать это?

EDIT:

Что относительно этого? Кто-нибудь видит какие-либо проблемы с этим? Я положил его в app_controller.

function appError($method, $params) { 

    //do clever stuff here 

} 

ответ

6

Это должно сработать. Предполагая, что вы перенаправляете 404 в действие контроллера LegacyUrls :: map(). Код необходимо сохранить в app/app_error.php:

<?php 
class AppError extends ErrorHandler{ 
    function error404($params) { 
     $Dispatcher = new Dispatcher(); 
     $Dispatcher->dispatch('/legacy_urls/map', array('broken-url' => '/'.$params['url'])); 
     exit; 
    } 

    function missingController($params) { 
     $Dispatcher = new Dispatcher(); 
     $Dispatcher->dispatch('/legacy_urls/map', array('broken-url' => '/'.$params['url'])); 
     exit; 
    } 
} 
?> 

Удачи вам!

4

Я всегда создал приложение \ Views \ ошибки \ missing_action.ctp и приложение \ Views \ ошибки \ missing_controller.ctp

торт будет автоматически отображать один из тех взглядов, когда URL не отображает к контроллеру или его методам.

Если у вас есть для кодов ошибок, которые вы не дали, это будет работать отлично!

0

Я хотел бы увеличить ответ felixge.

Эта версия выдает сообщение об ошибке 404 в браузере:

class AppError extends ErrorHandler 
{ 
     function _outputMessage($template) 
     { 
       if ($template === 'error404') { 
         $Dispatcher = new Dispatcher(); 
         $Dispatcher->dispatch('legacy_urls/map', array('broken-url' => '/'.$params['url'])); 
         return; 
       } 
       parent::_outputMessage($template); 
     } 
}