186 Nachrichten unter 64 Themen von 56 Mitgliedern
[SilverStripe Roadmap][Changelog]

Weiterleitung alter URLs (Buch 353ff)

Seite: 1 2005 mal gelesen
  • hu
    hu Community Member
    4 Beiträge

    Weiterleitung alter URLs (Buch 353ff)

    Hallo Steven,

    ich komme mit eurem Beispiel nicht wirklich zurecht. Ich versuche ein Mapping von alten php-Seiten bspw.

    'kontakt/anschrift.php' => 'anschrift'
    'kontakt/anfahrt.php' => 'anfahrt'

    zu erreichen, bekomme aber immer ein "404 Not Found" angezeigt. (kein 404 vom Silverstripe System)

    Problem 1: .htaccess
    Kann man problemlos die Rewrite Condition ändern ohne das System zu gefährden?
    RewriteCond %{REQUEST_URI} !(\.gif)|(\.jpg)|(\.png)|(\.css)|(\.js)|(\.php)$
    in diesem Fall müsste .php an sapphire weitergeleitet werden, also:
    RewriteCond %{REQUEST_URI} !(\.gif)|(\.jpg)|(\.png)|(\.css)|(\.js)$

    Problem 2: _config.php
    Durch die Weiterleitung an CustomModelAsController mit
    Director::addRules(1, array(
       '$URLSegment//$Action/$ID/$OtherID' => 'CustomModelAsController'
    ));

    kommen in der Funktion getNestedController() {...} folgende Werte in urlParams an

    # URLSegment = kontakt
    # Action = anschrift
    # ID =
    # OtherID =

    ich brauche aber so etwas wie 'kontakt/anschrift.php', um in der Datenbank die LegacyURL aufzulösen.
  • chillu
    chillu Community Member
    14 Beiträge

    Re: Weiterleitung alter URLs (Buch 353ff)

    Hallo,

    das Rezept funktioniert leider nur mit "SilverStripe-style" LegacyURLs, also alphanumerische Werte mit Bindestrichen. Zugegeben ist die Einleitung in das Rezept dahingehend etwas irreführend. Was nicht funktioniert:
    - Dateien mit einer Dateieindung - benötigt Anpassung im Rezept, ich arbeite gerade daran
    - Dateien mit .php Endung - dafür muss die RewriteCond in der .htaccess geändert werden
    - Dateien in Unterverzeichnissen

    Ingo
  • chillu
    chillu Community Member
    14 Beiträge

    Re: Weiterleitung alter URLs (Buch 353ff)

    Hatte endlich etwas Zeit um mich um die Implementierung zu kümmern.
    Im Endeffekt haben sich ein halbes Duzend Zeilen geändert...


    <?php
    class CustomModelAsController extends ModelAsController {
       public function handleRequest($request) {
          $this->request = $request;
          return parent::handleRequest($request);
       }
       public function getNestedController() {
          $url = $this->request->getUrl();
          $getVars = $this->request->getVars();
          if(isset($getVars['url'])) unset($getVars['url']);
          if($getVars) $url .= '?' . http_build_query($getVars);
          if($url) {
             $SQL_URLSegment = Convert::raw2sql($url);
             $page = DataObject::get_one(
                'Page',
                "`SiteTree`.LegacyURL = '{$SQL_URLSegment}'"
             );
             if($page) {
                $response = new HTTPResponse();
                $newUrl = Director::baseURL() . $page->URLSegment;
                $response->redirect($newUrl, 301);
                return $response;
             }
          }
          
          return parent::getNestedController();
       }
    }
    ?>


    Außerdem muss in der .htaccess die folgende Zeile durch ein vorangestelltes '#' deaktiviert werden:

    #RewriteCond %{REQUEST_URI} !(\.gif)|(\.jpg)|(\.png)|(\.css)|(\.js)|(\.php)$

    Dadurch können auch LegacyURL parameter mit .php Endung korrekt weitergeleitet werden.

    Grüße
    Ingo
  • hu
    hu Community Member
    4 Beiträge

    Re: Weiterleitung alter URLs (Buch 353ff)

    Hallo Ingo,

    sehr feine Lösung, es hat sich gelohnt zu warten.

    Eine Frage habe ich noch: Das Deaktivieren der Rewrite Condition stellt jetzt aber kein Sicherheitsrisiko dar, oder?

  • chillu
    chillu Community Member
    14 Beiträge

    Re: Weiterleitung alter URLs (Buch 353ff)

    Nein, nicht mehr oder weniger Sicherheitsrisiko als vorher. PHP Dateien können weiterhin direkt über die URL aufgerufen werden, wenn sie existieren. "Virtuelle" PHP Dateien werden weiterhin mit "RewriteCond %{REQUEST_FILENAME} !-f" an main.php weitergeleitet.

Zur Zeit online: Zur Zeit ist leider niemand online.

Wir begrüßen unsere neuen Mitglieder: FG