index.php im root etwas angepasst, die ja im Grunde nur auf die eingestellte Startseite weiterleitet.Dieses Weiterleiten kann man bei Übergabe von Parametern aber auch für Short-URLs nutzen.
So leitet
domain.tld/?350 auf den Artikel 350 weiter, also z.B.domain.tld/_rubric/detail.php?nr=350&rubric=rubriknameweiter, wenn eine Nummer übergeben wird.
Wird dagegen ein Text übergeben wie
domain.tld/?Test, wird auf eine gleichnamige Rubrikdomain.tld/_rubric/inde.php?rubric=Testumgeleitet.
Die entsprechenden Verzeichnisse bzw. Rubriken werden aus der Datenbank ausgelesen.
Dazu in der
index.php im cpo-root VOR der Zeile
Code: Alles auswählen
header('Location: '.BASE_ABS.$cpoSystem['homepage']);Code: Alles auswählen
// redirect short urls
if (!empty($_SERVER['QUERY_STRING'])) {
// target needed?
$articleTarget = "";
$rubricTarget = "";
// get all released articles
$db = new DB;
$urls = array();
$articlestates = $cpoSystem['release']
? 'artikel_archiv<2 AND freigabe='.STATE_RELEASED.' '
: 'artikel_archiv<1 AND freigabe!='.STATE_BLOCKED.' ';
$addwhere = $articlestates
."AND pub_datum<='".date('Y-m-d H:i:s', time())."' "
."AND verfallsdatum>='".date('Y-m-d H:i:s', time())."' ";
$query = 'SELECT nr, name, directory FROM '.CPO_NEWS.', '.CPO_RUBRIC.' where id=rubric_id AND ' . $addwhere;
$db->query($query);
while ($db->next_record())
$urls[$db->v('nr')] = BASE_ABS.$db->v('directory')."/detail.php?nr=".$db->v('nr')."&rubric=".$db->v('name').$articleTarget; // released articles stored in $releasedArticles
// get all rubrics
$query = 'SELECT directory, name FROM '.CPO_RUBRIC.' ';
$db->query($query);
while ($db->next_record())
$urls[$db->v('name')] = BASE_ABS.$db->v('directory')."/index.php?rubric=".$db->v('name').$rubricTarget; // existing rubrics stored in $rubricList
// check for matching keys, otherwise redirect to homepage
if (!array_key_exists($_SERVER['QUERY_STRING'], $urls)) {
header('Location: '.BASE_ABS.$cpoSystem['homepage']);
exit;
}
header('Location: '.$urls[$_SERVER['QUERY_STRING']]);
exit;
}
Code: Alles auswählen
// target needed?
$articleTarget = "";
$rubricTarget = "";
#article definiert werden, wenn z.B. der Inhalt direkt angesteuert werden soll statt erst den Seitenkopf zu zeigen.Hinweis: Zuerst werden alle freigegebenen Artikel und existierenden Rubriken eingelesen und damit der übergebene Query-String verglichen. So sind keine SQL-Injections möglich.
Ggf. wird dieses Auslesen in neue CPO+ Versionen einfließen, so dass hier nur noch der Vergleich durchgeführt werden muss. Artikel- und Rubriklisten werden ja immer mal wieder gebraucht.