2009-06-03 2 views
1

ist diese Frage zu meiner alten Post Dealing with Alias URLs in CakePHPKann ich CakePHP basierend auf bestimmten Bedingungen einen passenden Statuscode zurückgeben lassen?

Nach reiflicher Überlegung, erforsche ich die Möglichkeit, einen benutzerdefinierten 404-Skript mit in meinem Kuchen App, das erreicht wird, wenn eine URL abbildet nicht an Controller/Aktionen leicht im Zusammenhang . Dieses Skript würde $ this-> hier überprüfen und es in einer Datenbank von Weiterleitungen nachschlagen. Wenn eine Übereinstimmung gefunden wird, wird ein bestimmter "Promo" -Code verfolgt und umgeleitet.

Ich denke, Statuscodes. Kann ich mein Skript basierend auf bestimmten Bedingungen einen geeigneten Statuscode zurückgeben lassen? Zum Beispiel:

  1. URL entspricht eine Umleitung - Rückkehr eine 301
  2. URL wirklich kein Ziel hat - Rückkehr ein 404.

Kann ich das tun?

EDIT:

Was ist damit? Hat jemand Probleme damit? Ich habe es in app_controller gesetzt.

function appError($method, $params) { 

    //do clever stuff here 

} 

Antwort

6

Dies sollte funktionieren. Angenommen, Sie leiten 404s in einer LegacyUrls :: map() - Controlleraktion um. Der Code muss in app/app_error.php gespeichert werden:

Viel Glück!

4

Ich habe immer App erstellt \ views \ errors \ missing_action.ctp und app \ views \ errors \ missing_controller.ctp

Kuchen wird automatisch eine dieser Ansichten angezeigt werden, wenn eine URL nicht abbildet zu einem Controller oder seinen Methoden.

Es sei denn es gibt einen bestimmten brauchen für die Fehlercodes, die Sie nicht gaben, würde dies perfekt funktionieren!

0

Ich möchte felixge die Antwort erweitern.

Diese Version gibt einen 404-Fehler an den Browser:

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