2009-06-03 12 views
1

Cette question est un peu lié à mon ancien poste Dealing with Alias URLs in CakePHPPuis-je demander à CakePHP de renvoyer un code d'état approprié en fonction de certaines conditions?

Après mûre réflexion, j'explore la possibilité d'avoir un script 404 dans mon application Cake, qui est atteinte lorsqu'une URL ne correspond pas aux contrôleurs/actions . Ce script vérifie $ this-> ici et le recherche dans une base de données de redirections. Si une correspondance est trouvée, elle suivra un code de promotion spécifique et redirigera.

Je pense aux codes d'état. Puis-je demander à mon script de renvoyer un code d'état approprié en fonction de certaines conditions? Par exemple:

  1. URL correspond à une redirection - retourner un 301
  2. URL n'a vraiment pas une destination - retour d'un 404.

Puis-je faire cela?

EDIT:

Qu'en est-ce? Quelqu'un voit-il des problèmes avec cela? Je l'ai mis dans app_controller.

function appError($method, $params) { 

    //do clever stuff here 

} 

Répondre

6

Cela devrait fonctionner. En supposant que vous redirigez 404 à une action du contrôleur LegacyUrls :: map(). Le code doit être stocké dans 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; 
    } 
} 
?> 

Bonne chance!

4

J'ai toujours créé l'application \ vues \ erreurs \ app missing_action.ctp et \ vues \ errors \ missing_controller.ctp

gâteau affiche automatiquement l'un de ces vues lorsqu'une URL ne correspond pas à un contrôleur ou à ses méthodes.

À moins qu'il y ait un certain besoin pour les codes d'erreur que vous n'avez pas donné, cela fonctionnerait parfaitement!

0

Je voudrais compléter la réponse de Felixge.

Cette version délivre en sortie une erreur 404 au navigateur:

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); 
     } 
}