Das werde ich heute Abend gleich ausprobieren und ich freue mich auch schon sehr auf die später folgende Zusammenstellung!

(kein Stress, das waren eben bestimmt die entscheidenden Codezeilen, die ich jahrelang gesucht hatte!)
Moved_XH tut eigentlich nichts, was nicht auch mit Apache-Modulen bewerkstelligt werden könnte. Allerdings stehen diese nicht jedem zur Verfügung, und auch deren Nutzung ist nicht unbedingt einfach – daher das Plugin.Michael_G wrote:Wenn das bei URLs mit Fragezeichen funktionieren würde, wäre Moved_XH obsolet.Code: Select all
# Umgezogene Seiten melden: RedirectPermanent /Computer/CMS https://domain.tld/Computer/Software/CMS # Nicht mehr vorhandene Seiten aus dem Index nehmen lassen: Redirect gone /Gibbetnetmehr/
Code: Select all
<link rel="canonical" href="http://domain.tld/">
Code: Select all
http://domain.tld/?Startseite&parm=1
Code: Select all
<link rel="canonical" href="http://domain.tld/?¶m=1">
Ich bin der Meinung, dass das vom jeweiligen Fall abhängt. Z.B. sind Parameter bei Realblog, Forum, und allgemein bzgl. einer Paginierung sehr wichtig für den kanonischen Link. Manche Parameter (z.B. print) hingegen sollten auf keinen Fall im kanonischen Link auftauchen. Eine wirklich saubere Lösung, um das zu unterscheiden, wäre erstrebenswert, aber da müssten wohl Plugins entsprechend mitarbeiten. Ansonsten fällt mir nichts besseres ein als die Lösung, die schon seit langem auf 3-magi.net läuft:Holger wrote:Was ist, wenn die Seite mit Query-Parametern aufgerufen wird?
Code: Select all
/**
* Returns the canonical link tag.
*
* @param string $prefix 'www' or ''.
* @param array $ignore_keys
* @return string
*/
function canonical($prefix, $ignore_keys = array()) {
global $sn, $su, $u;
$params = $_GET;
if (count($params) > 0 && key($params) == $su)
array_shift($params);
ksort($params);
if (!empty($prefix)) $prefix .= '.';
$rsn = preg_replace('/index.php$/i', '', $sn);
$server_name = preg_replace('/^www./i', '', $_SERVER['SERVER_NAME']);
$rsu = $su == $u[0] ? '' : $su;
$url = 'http://'.$prefix.$server_name.$rsn;
$query = $rsu;
foreach($params as $key => $val) {
if (!in_array($key, $ignore_keys)) {
$query .= '&'.$key;
if (!empty($val)) $query .= '='.$val;
}
}
if (!empty($query)) $url .= '?'.$query;
$link = tag('link rel="canonical" href="'.$url.'"')."\n";
return $link;
}
Code: Select all
<?php echo canonical('', array('login'))?>
Bin nicht ganz sicher, da ohne explizite Angabe der Startseite ja wieder das leidige $s Problem auftritt. Falls wir letzteres nicht für XH 1.7 in den Griff bekommen, dann wäre vielleicht die umgekehrte Variante eine Lösung, obwohl das wohl erst recht Probleme macht.svasti wrote:Könnten wir nicht in 1.7 überhaupt einbauen, dass
http://domain.tld/?Startseite zu
http://domain.tld/ wird?
Sehe ich auch so.cmb wrote:Ich bin der Meinung, dass das vom jeweiligen Fall abhängt. Z.B. sind Parameter bei Realblog, Forum, und allgemein bzgl. einer Paginierung sehr wichtig für den kanonischen Link.
Gut, aber welche genau? Welche Parameter erzeugen denn nicht die gleichen Ausgabe beim Aufruf der Domain gegenüber dem Aufruf der ersten Inhaltsseite?cmb wrote:Manche Parameter (z.B. print) hingegen sollten auf keinen Fall im kanonischen Link auftauchen.
Upps, da hatte ich den Kontext aus den Augen verloren. Sorry!Holger wrote:Nochmal zur Klarstellung: ich rede hier ausschließlich nur vom DC-Problem mit der ersten Inhaltsseite.
Doppelter Content ist wohl auch schon, wenn sich grosse Teile des Inhaltes gleichen.Für mich sind das keine identische Seiten.
Super!Holger wrote:Hier mal der Entwurf eines Plugins, mit dem man die hier im Thread dargestellten DC-Probleme auch lösen kann.
Schneller sind die str_* Funktionen im Zweifel schon, aber es kommt natürlich immer auf den konkreten Fall an, und libpcre ist schon sehr aufwendig optimiert, und ext/pcre hat auch noch zusätzlich einen Cache für kompilierte Ausdrücke, so dass zumindest bei mehrfacher Verwendung des selben Ausdrucks und gerade wenn pcre.jit=1 (gibt's ab PHP 7.0.0) ist, der Performance-Unterschied nicht mehr allzu groß sein dürfte.Holger wrote:BTW: beim konstruieren der URLs habe ich, soweit noch halbwegs sinnvoll, nur str*() - Funktionen anstatt preg*() - Funktionen verwendet. Angeblich soll das ja "besser" (bzw. schneller) sein. Macht das im konkreten Fall denn Sinn? Wenn nicht könnte man am Code auch noch zwei, drei Zeilen sparen...
Code: Select all
if (strtolower(substr($path, -9)) == 'index.php') {
Code: Select all
if (strripos($path, 'index.php', -9) == strlen($path) - 9) {