Eintrag im Alias für MOD Rewrite verwenden?

Gesperrt
Altermac
Beiträge: 6
Registriert: Fr 11. Jun 2010, 21:45
Wohnort: Rommerskirchen
Kontaktdaten:

Eintrag im Alias für MOD Rewrite verwenden?

Beitrag von Altermac »

Hallo!

Ich möchte gerne eine sehr alte Site auf Contenido übernehmen. Um die Links auf die alten URLS zu retten möchte ich Umschreibungen der Contenido-URLS auf den alten Dateinamen seiten-name.html machen. Ich würde hierzu den Alias des Artikels verwenden:

Alias = alter-seitenname.html
URL im Browser = Domain.de/alter-seitenname.html

Optimal wäre jetzt, wenn beim Mod-Rewrite nur noch dieser Alias in der URL auftauchen würde und der Alias zur Verlinkung beibehalten werden könnten. Wenn ich die Doku von AMR richtig verstanden habe, stehen hier aber nur Pfade über die Kategorien zur Verfügung (im Stil: Kategorie/Kategorie/Alias.Endung). Ich möchte auch vermeiden alle alten Seiten im Routing aufzunehmen.

Gibt es hierfür eine einfache Lösung?

Gruß
Altermac
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Eintrag im Alias für MOD Rewrite verwenden?

Beitrag von xmurrix »

Hallo Altermac,

die einfachste Lösung wäre das Umleiten von alten Seiten auf die neuen Seiten, entweder per htaccess oder per internes routing des AMR-Plugins.

Du schreibst, das du das Routing ungern verwenden möchtest, dann hast du noch folgende Alternativen:
  • Aufbauen der Kategoriestruktur, so das man daraus die alten URLs generieren kann
    Beispiel:
    Alte Seite: ueberuns-team.html

    Neue Seite in Contenido:
    Kategorie: Überuns
    Kategoriealias: ueberuns
    Trenner zwischen Kategorie u. Artikel "-"
    Artikel: Team
    Artikelalias: team
  • Erstellen eines eigenen URL-Builders, der die URLs so generiert, wie es erwünscht ist. Ist besser, als das AMR-Plugin anzupassen, hast sonst später Probleme bei updates
Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Altermac
Beiträge: 6
Registriert: Fr 11. Jun 2010, 21:45
Wohnort: Rommerskirchen
Kontaktdaten:

Re: Eintrag im Alias für MOD Rewrite verwenden?

Beitrag von Altermac »

Ich tendiere in Richtung eigener URL-Builder. Auf diese Weise kann ich im Artikel oder in der Kategorie einen "Dateinamen" hinterlegen und muß keine 301er pflegen. Die alten URLs waren schon recht gut "SEO"-optimiert.

Gibt es eine gute Dokumentation zum Thema URL-Builder?
Ich hab bislang nur die Kommentare im Sample gefunden. Für einen eigenen Versuch ist mir das noch zu wenig.
kummer
Beiträge: 2423
Registriert: Do 6. Mai 2004, 09:17
Wohnort: Bern, Schweiz
Kontaktdaten:

Re: Eintrag im Alias für MOD Rewrite verwenden?

Beitrag von kummer »

Geht es dir darum, dass du gar keine Moved-Permanently-Header pflegen möchtest oder darum, dass du dauerhaft die alten URLs beibehalten möchtest? Weil wenn du weitere Artikel hinzufügen wirst, musst du dann die entsprechende Information immer weiterpflegen müssen. Das dürfte auf Dauer erheblich umständlicher sein, zumal du Konflikte vermeiden musst.

Falls es nur eine Frage des Pflegeaufwands ist, dann hätte ich dir evt. eine Lösung mit Rewrite History. Ansonsten müsstest du wohl eine eigene Umschreibung schreiben.
aitsu.org :: schnell - flexibel - komfortabel :: Version 2.2.0 (since June 22, 2011) (jetzt mit dual license GPL/kommerziell)
xmurrix
Beiträge: 3215
Registriert: Do 21. Okt 2004, 11:08
Wohnort: Augsburg
Hat sich bedankt: 4 Mal
Danksagung erhalten: 17 Mal
Kontaktdaten:

Re: Eintrag im Alias für MOD Rewrite verwenden?

Beitrag von xmurrix »

Altermac hat geschrieben:...Gibt es eine gute Dokumentation zum Thema URL-Builder? ...
Eine vollständige Dokumentation dazu gibt es nicht, gehe aber folgendermaßen vor:
  • Als groben Einstieg zum Thema den Beitrag http://forum.contenido.org/viewtopic.php?f=64&t=23280 durchlesen, falls du es schon nicht gemacht hast
  • Implementiere einen eigenen UrlBuilder auf Basis von contenido/classes/UrlBuilder/Contenido_UrlBuilder_Custom.class.php.
    Erstelle im Verzeichnis contenido/classes/UrlBuilder/ eine Kopie von Contenido_UrlBuilder_Custom.class.php, z. B. Contenido_UrlBuilder_MyCustom.class.php.
    Öffne die Datei Contenido_UrlBuilder_MyCustom.class.php und ändere den Klassenamen Contenido_UrlBuilder_Custom in Contenido_UrlBuilder_MyCustom.
    Falls nicht vorhanden, erstelle eine Datei config.local.php im Ordner contenido/includes/ und schreibe folgendes rein:

    Code: Alles auswählen

    <?php
    
    global $cfg;
    
    $cfg['url_builder']['name']   = 'MyCustom';
    $cfg['url_builder']['config'] = array('suffix' => '.html');
    cInclude('classes', 'Url/Contenido_Url.class.php');
    cInclude('classes', 'UrlBuilder/Contenido_UrlBuilderConfig.class.php');
    Contenido_UrlBuilderConfig::setConfig($cfg['url_builder']);
    
    Die Datei contenido/includes/config.local.php wird vom Contenido startup-Prozess eingebunden, die darin definierte UrlBuilder-Konfiguration wird somit übernommen

    Passe die Funktion buildUrl() in der Datei Contenido_UrlBuilder_MyCustom.class.php deinen Bedürfnissen an, z. B.:

    Code: Alles auswählen

        public function buildUrl(array $aParams, $bUseAbsolutePath = false, array $aConfig = array()) {
            if (sizeof($aParams) == 0) {
                throw new InvalidArgumentException('$aParams must have at least one entry!');
            }
    
            $this->sUrl = $bUseAbsolutePath === true ? $this->sHttpBasePath : '';
            
            if (isset($aParams['idart']) && (int) $aParams['idart'] > 0) {
                // just a sample, you have to implement function getArticleAliasByIdArt()
                // $this->sUrl .= getArticleAliasByIdArt($aParams['idart']);
            } elseif (isset($aParams['idcatart']) && (int) $aParams['idcatart'] > 0) {
                // just a sample, you have to implement function getArticleAliasByIdCatArt()
                // $this->sUrl .= getArticleAliasByIdCatArt($aParams['idcatart']);
            }
            
            $this->sUrl .= '.' . $this->aConfig['suffix'];
        }
    
    Die Funktionen getArticleAliasByIdArt() und getArticleAliasByIdCatArt() müsstst du noch implementieren. Diese sollen anhand der idart oder idcatart den Alias der Seite liefern.
  • Der Rest wird von Contenido übernommen. Du musst nur dafür sorgen, dass sämtliche URLs in allen Modulen/Plugins den Contenido UrlBuilder verwenden, z. B.:

    Code: Alles auswählen

    // mit idcat
    $aParams = array ('idcat' => $idcat, 'lang' => $lang);
    $url = Contenido_Url::getInstance()->build($aParams);
    
    // oder mit idart
    $aParams = array ('idart' => $idcat, 'lang' => $lang);
    $url = Contenido_Url::getInstance()->build($aParams);
    
    Der Parameter für Sprache ($lang) sollte immer übergeben werden. Auch wenn deine UrlBuilder Klasse dies nicht verwendet, andere UrlBuilder erwarten diesen Parameter. Sonst kann das bei einem Wechsel zu einem anderen UrlBuilder zu Problemen führen.
    Contenido_Url verwendet dann deinen eigenen UrlBuilder, d. h. der Aufruf von Contenido_Url::getInstance()->build($aParams); wird an die buildUrl() Funktion deiner Klasse Contenido_UrlBuilder_MyCustom weitergereicht.
  • Dann brauchst du noch ein paar Regeln in der .htaccess damit Requests auf die front_content.php umschrieben werden. Die folgenden Regeln sind nur Beispiele, können in deinem Fall abweichend sein.

    Code: Alles auswählen

    # Enable rewrite engine
    RewriteEngine on
    
    # Specify a base URL-path for the rules
    RewriteBase /cms
    
    # Rewrite request to root to front_content.php
    RewriteRule ^$ front_content.php [QSA,L]
    
    # Exclude following request from rewriting
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d      
    RewriteRule ^.*$ - [NC,L]
    
    # Pass other requests to front_content.php
    RewriteRule ^.*$ front_content.php [QSA,NC,L]
    
  • Falls nicht vorhanden, erstelle eine Datei config.local.php im Mandantenverzeichnis cms/ und schreibe folgendes rein:

    Code: Alles auswählen

    <?php
    
    global $cfg, $idart;
    
    $uri      = (string) $_SERVER['REQUEST_URI'];
    $pathinfo = pathinfo($uri);
    $suffix   = $cfg['url_builder']['config']['suffix'];
    
    if (isset($pathinfo['extension']) && $pathinfo['extension'] == $suffix) {
        // set idart by incomming request uri
        // just a sample, you have to implement function getIdArtByRequestUri()
        $idart = (int) getIdArtByRequestUri($uri);
    }
    
Diese Datei wird am Anfang der front_content.php eingebunden, dessen Inhalt soll anhand der $_SERVER['REQUEST_URI'] (der z. B. 'seitenname.html' enthält) die Artikelid setzen.
Die Funktion getIdArtByRequestUri() müsstest du noch implementieren. Die soll anhand der Request-URI (z. B. 'seitenname.html') die Artielid zurückliefern.

Die Beispiele sind sehr einfach gehalten, keine richtige Fehlerbehandlung, keine Verwendung von Contenido Chains und sonstige Spielereien wie OOP, usw. - Hoffentlich hilft dir das bei deinem Vohaben weiter ...

Gruß
xmurrix
CONTENIDO Downloads: CONTENIDO 4.10.1
CONTENIDO Links: Dokumentationsportal, FAQ, API-Dokumentation
CONTENIDO @ Github: CONTENIDO 4.10 - Mit einem Entwicklungszweig (develop-branch), das viele Verbesserungen/Optimierungen erhalten hat und auf Stabilität und Kompatibilität mit PHP 8.0 bis 8.2 getrimmt wurde.
Gesperrt