Seite 1 von 1

Verschachtelung von "Durch Domain ersetzen"

Verfasst: Di 23. Mai 2017, 16:29
von Utakka
Moin zusammen,

wir nutzen die Funktion "Verzeichnis durch Domain ersetzen" sehr häufig und zumeist klappt das auch wunderbar. Nun haben wir allerdings einen Fall, der etwas tricky ist. webEdition Version ist 6.4.4, Verzeichnisstruktur ist in etwa wie folgt:

Hauptverzeichnis A: Durch "domainA.de" ersetzen
- Unterverzeichnis 1: Durch "domain1.com" ersetzen
- Unterverzeichnis 2: Nicht ersetzen (sollte "domainA.de" erben)
Hauptverzeichnis B: Durch "domainB.de" ersetzen

Wenn man nun Dokumente aus Unterverzeichnis 1 verlinkt, wird mal domain1.com (wie gewünscht) und mal domainA.de (vom Oberverzeichnis) ausgegeben. Ein Prinzip ist nicht erkennbar.

Hat jemand von euch zufällig ähnliche Erfahrungen?

Und ganz generell: Wo ist der für die Ersetzung zuständige Code im webEdition Quellcode eigentlich zu finden? Würde dann ggf. auch gern selbst mal reinschauen.

Schönen Gruß!
Lars

Re: Verschachtelung von "Durch Domain ersetzen"

Verfasst: Di 23. Mai 2017, 19:35
von mokraemer
hmm, das wundert mich etwas. Die Ersetzungen werden in absteigender Pfadsortierung (Länge) vorgenommen. Also sollte der tiefste Pfad auch zuerst ersetzt werden.
Die Ersetzung findet in webEdition/we/include/we_classes/contents/we_folder.class.php (getUrlReplacements) statt. Bzw. wird da vorbereitet.

Re: Verschachtelung von "Durch Domain ersetzen"

Verfasst: Mi 24. Mai 2017, 08:49
von Utakka
Joar, wundert mich auch. Besonders, weil das von Seite zu Seite unterschiedlich ist. Hatte erst schon irgendein Caching auf dem Server in Verdacht..

Aber danke für den Hinweis zur entsprechenden Klasse. Macht die Suche etwas einfacher!

Re: Verschachtelung von "Durch Domain ersetzen"

Verfasst: Mi 24. Mai 2017, 10:08
von Utakka
Okay, gefunden. Die Länge des Pfades spielte bislang keine Rolle, stattdessen wurde der Pfad alphanumerisch sortiert abgefragt. Die entsprechende Abfrage in getUrlReplacements() sah bislang wie folgt aus:

Code: Alles auswählen

'SELECT Path,urlMap FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY Path DESC'
Das habe ich bei uns jetzt mal dahingehend geändert, dass auf die Anzahl der Schrägstriche, also die Anzahl der Unterorder abgefragt und absteigend sortiert wird:

Code: Alles auswählen

'SELECT Path,urlMap,(LENGTH(Path)-LENGTH(REPLACE(Path,"/",""))) AS subfolders FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY subfolders DESC, Path'
Dadurch wird das Array zumindest schon mal korrekt aufgebaut, die tiefsten Pfade sind nun an erster Stelle. Damit war es aber noch nicht ganz erledigt. Mittels $lastRules wurde die Domain bisher wieder ans Ende des Arrays geschoben, sofern man ein zur Domain zugeordnetes Dokument aufgerufen hat. Das machte die Ersetzung wieder kaputt und ist - zumindest in unserem Fall - gar nicht nötig.

Die von mir überarbeitete Funktion sieht nun wie folgt aus:

Code: Alles auswählen

  public static function getUrlReplacements(we_database_base $db, $onlyUrl = false, $hostMatch = false){
    static $ret = -1;
    if($ret == -1){
      $ret = array('full' => array(), 'url' => array(), 'full_host' => array(), 'url_host' => array(),);
      $db->query('SELECT Path,urlMap,(LENGTH(Path)-LENGTH(REPLACE(Path,"/",""))) AS subfolders FROM ' . FILE_TABLE . ' WHERE urlMap!="" ORDER BY subfolders DESC, Path');
      while($db->next_record(MYSQL_NUM)){
        $host = trim(str_replace(array('https://', 'http://'), '', $db->f(1)), '/');
        $rep1 = '-((href\s*=|src\s*=|action\s*=|location\s*=|content\s*=|url)\s*["\'\(])(' . preg_quote($db->f(0), '-') . ')(/[^"\'\)]*["\'\)])-';
        $rep2 = '-^' . preg_quote($db->f(0), '-') . '(/.*)-';
        if($_SERVER['SERVER_NAME'] == $host){
          $ret['full']['${1}${4}'] = $rep1;
          $ret['url']['${1}'] = $rep2;
        } else {
          $ret['full']['${1}//' . $host . '${4}'] = $rep1;
          $ret['url']['//' . $host . '${1}'] = $rep2;
        }
        $ret['full_host']['${1}' . '//' . $host . '${4}'] = $rep1;
        $ret['url_host']['//' . $host . '${1}'] = $rep2;
      }
    }
    return $ret[($onlyUrl ? 'url' : 'full') . ($hostMatch ? '_host' : '')];
  }
Magst du das vielleicht mal gegenchecken und ggf. für ein nächstes webEdition Update mit aufnehmen? Oder sollen wir das als Bugreport anlegen?

Re: Verschachtelung von "Durch Domain ersetzen"

Verfasst: Mi 24. Mai 2017, 11:00
von mokraemer
ich kann der Logik nicht folgen:
die Anzahl der Schrägstriche bzw. die Alpha-Nummerische Sortierung tuen doch genau das gleiche. Denn absteigend wird /a/b vor /a gesetzt und damit genau das gleiche erreicht, nur wesentlich effizienter als hier eine Funktion aufzurufen die Schrägstriche zählt.
Und ein zur Domain gehöriges Dokument sollte eben nicht vollqualifiziert ausgegeben werden.

Re: Verschachtelung von "Durch Domain ersetzen"

Verfasst: Mi 24. Mai 2017, 11:19
von Utakka
Bei der Sortierung hast du Recht, das sollte sogar alphanumerisch klappen. Die tatsächliche Anzahl der Unterordner erschien mir nur "sauberer". Das ändert allerdings nichts am $lastRules Problem.

Zur Verdeutlichung mal folgendes Szenario. Diese verschachtelten Ordner sollen jeweils durch eine Domain ersetzt werden:
/OrdnerA/ -> domain1.de
/OrdnerA/UnterordnerB/ -> domain2.de

Wenn ich das aktuelle Dokument nicht über domain1.de oder domain2.de aufrufe, die if Abfrage $_SERVER['SERVER_NAME']==$host also nicht greift, erzeugt die Funktion ein solches Array:
"/OrdnerA/UnterordnerB/" ersetzen durch "http://domain2.de/"
"/OrdnerA/" ersetzen durch "https://domain1.de/"

Wenn ich mich aber im Unterordner (domain2.de) befinde, wird der entsprechende Datensatz mittels $lastRules ans Ende des Arrays geschoben. Das sieht dann wie folgt aus:
"/OrdnerA/" ersetzen durch "https://domain1.de/"
"/OrdnerA/UnterordnerB/" ersetzen durch "/"

Beim letzten Durchgang greift das Ersetzen dann nicht mehr, weil der Oberordner bereits ersetzt wurde.

Aus meiner Sicht spricht nichts dagegen, auf das "Ans Ende des Arrays schieben" zu verzichten. Die Abfrage auf "SERVER_NAME" gibt es in meiner angepassten Version ja trotzdem noch, die Pfade werden nach wie vor sauber mit absolutem Pfad (nicht vollqualifiziert) ausgegeben.