HowTo: Einbinden von canonical in den Header mit TYPO3

Das “canonical”-Tag ist in aller Munde. Es dient dazu duplicate content für die Suchmaschinen identifizierbar zu machen.

Unter TYPO3 hat man automatisch schon doppelte Inhalte, da eine Seite z.B. unter: www.domain.de/index.php?id=1 oder unter www.domain.de/?id=1 erreichbar ist. Die Beispiele lassen sich natürlich beliebig fortsetzen.

Da TYPO3 das (noch) nicht von Haus aus als headerData mitbringt, müssen wir das halt händisch basteln.

Um einen enstprechenden Tag in der Form

<link href=”http://www.domain.de/seite.html” rel=”canonical”/>

zu bekommen, bemühen wir mal ein bisschen TypoScript und basteln uns etwas zusammen:

# baseURL setzen (falls nicht schon vorher geschehen) WICHTIG den / am Ende nicht vergessen
config.baseURL = http://www.domain.de/

# holen des URL-Teil hinter dem ersten /
temp.activepage = TEXT
temp.activepage.typolink {
parameter.data = TSFE:id
returnLast = url   
}

# Erstellung des Header-Link-Tag in mehreren Teilen
page.headerData = COA
page.headerData.10 = TEXT
page.headerData.10 {
value = <link rel=”canonical” href=”

page.headerData.20 = TEXT
page.headerData.20 {
value < config.baseURL
}  
page.headerData.30 < temp.activepage
page.headerData.40 = TEXT
page.headerData.40 {
value = ” />  
}

Bei meinem kleinen Test hat das ganze sowohl auf einer Seite mit index.php?id=XY als auch mit RealURL funktioniert. Besonders schön ist, das durch die Nutzung der TYPO3 Linkerzeugung auch bei Aufruf einer Seite via index.php-Parameter die RealURL-Seite als canonical angegeben wird.

Ebenso wird durch die Einbindung von baseURL die Variante abgefangen, dass der Webauftritt unter verschiedenen URL (z.B. www.domain.de und www.domain.com) erreichbar ist.

Wäre noch interessant, ob die Lösung auch bei anderen klappt. Wie sieht es mit CoolURI aus? Über Feedback hier als Kommentar würde ich mich freuen.


21 Gedanken zu „HowTo: Einbinden von canonical in den Header mit TYPO3“

  1. Pingback: hype.yeebase.com
  2. Das geht mit wesentlich weniger Code ;)

    lib.canonical = TEXT
    lib.canonical {
    typolink.parameter.data = TSFE:id
    typolink.returnLast = url
    wrap =
    }
    page.headerData.1000 < lib.canonical

  3. Hi Peter!
    Weniger Code ist immer gut ;-) Irgendwie will Dein Code bei mir aber nicht funktionieren.

    Und wie fängst Du ab, dass die Seite z.B. unter fladi.de und fladi.com erreichbar ist?

  4. Hi,

    ist natürlich die Frage warum ein bot je die ?id=xx sehen sollte, oder die index.php?id=xxx

    wenn dann ist wohl wesentlich interessanter eine ext zu generieren, die einen user eintragen lässt wenns wo einen duplicate content gibt

  5. Hi Fladi,

    mir ist grad erst aufgefallen, dass dein Blog wohl meinen wrap mit HTML nicht mag, drum hier nochmal:

    wrap = [link rel="canonical=" href="{$baseURL}|" /]

    Die eckigen Klammern müssen natürlich durch spitze Klammern ersetzt werden.

    Gruß
    Peter

  6. Vielen Dank für den Tipp! Mit dieser Ergänzung hier funktionierts auch bei Extensions wie tt_news (es werden die notwendigen Parameter bei der Generierung der URL berücksichtigt):

    lib.canonical {
    typolink.addQueryString = 1
    typolink.addQueryString.method = POST,GET
    typolink.addQueryString.exclude = no_cache, id
    }

  7. Cooler Tipp. Jetzt kann ich auch in meine Typo-Seiten den Tag einbauen. Für wordpress hab ich auch schon ein plugin gefunden.

  8. Vielen Dank für den Tipp! Mit dieser Ergänzung hier funktionierts auch bei Extensions wie tt_news (es werden die notwendigen Parameter bei der Generierung der URL berücksichtigt):

    <blockquote>
    lib.canonical {
    typolink.addQueryString = 1
    typolink.addQueryString.method = POST,GET
    typolink.addQueryString.exclude = no_cache, id
    }
    </blockquote>

  9. Mir stellt sich nur die Frage, was man mit dem Zeugs soll. Prinzipiell fängt man doch solche Sachen durch mod_rewrite ab.

    .htaccess
    ———————-
    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^www.meineeine\.de$ [NC]
    RewriteRule ^(.*) http://meineeine.de/$1 [R=301]

    RewriteCond %{HTTP_HOST} ^www.meineandere\.com$ [NC]
    RewriteRule ^(.*) http://meineeine.de/$1 [R=301]

    RewriteCond %{HTTP_HOST} ^wasauchimmer\.de$ [NC]
    RewriteRule ^(.*) http://meineeine.de/$1 [R=301]

    Somit wird kein Code generiert und auch wieder ein bisschen Rechenzeit gespart. Total “green” config ;-)

    Wenn jetzt jemand anführen möchte, dass es Hoster gibt die kein mod_rewrite liefern sollte man sich überlegen ob man nicht zufällig einen Igel in der Tasche hat. Andere daseinsberechtigungen entziehen sich meinem Verständnis.

  10. “Wenn jetzt jemand anführen möchte, dass es Hoster gibt die kein mod_rewrite liefern sollte man sich überlegen ob man nicht zufällig einen Igel in der Tasche hat.”

    @ros: Besser als jeder Kaffee am Morgen!

  11. So ganz funktioniert diese Varinate noch nicht. Vor allem im Zusammenhang mit tt_news.

    Wenn ich folgende URL verwende: http://www.freizeitzentrum-weiden.de/erleben/aktuelles/artikel/datum/2011/07/08/neu-sauna-fruehtarif.html

    Wird diese ins Canonical Tag geschrieben. Das ist ja korrekt.

    Verwende ich aber folgende URL:
    http://www.freizeitzentrum-weiden.de/erleben/aktuelles/artikel/datum//07/08/neu-sauna-fruehtarif.html
    (Jahr 2011 weggelassen) So wird diese auch so in das Canonical Tag geschrieben und verweist aber auf die gleiche Seite. Eigentlich müsste doch jetzt im Canonical Tag die rste URL stehen, sonst macht das ganze ja keinen Sinn.

    Gruß Andreas

  12. Ich merk gerade wie doof doch meine Aussage war… Ich habe viel eher das Problem, dass das exludieren von Parametern nicht funktioniert.

    typolink {
    parameter.data = TSFE:id
    addQueryString = 1
    addQueryString {
    method = GET
    exclude = no_cache,id,PHPSESSID
    }
    }

    Es kommt leider immer noch vor das zum Teil bei irgendwelchen Seiten “PHPSESSID” in den Canonical-Tag landen. Ich kann’s mir bis dato nicht erklären.

  13. Hallo Fladi, Peter und alle
    Danke für dein Tip. Hatte damit aber Probleme mit der Startseite, da gabs mir ein //. Musste dies nun mit einer Variablen lösen:

    Constants:
    # url fuer canonical
    # Default
    meineVariable {
    var99 = http://www.????.ch
    }
    # ALOCO
    [globalVar = TSFE:id=1]
    meineVariable {
    var99 = http://www.????.ch/
    }
    [global]

    Setup:
    lib.canonical = TEXT
    lib.canonical {
    typolink.parameter.data = TSFE:id
    typolink.returnLast = url
    wrap =
    }
    page.headerData.1000 < lib.canonical

  14. Super, vielen Dank für die Anleitung, habe es gleich ausprobiert und mein Header ist jetzt so, wie ich es gerne haben wollte :-)

  15. Guten Tag, danke für diese Infos. Ich bekommen irgendwie nicht ihn, wegen der Multisprachgikeit.
    Die Seite ist auf DE und EN. Muss ich jetzt beim
    beim ausgabe der canonical link, in der EN version, bekomme ich:
    a href=”www.hauptdomain.com/www.englische domain.com” anstatt nur der http://www.englischedomain.com

    in der [globalVar = GP:L = 1] steht bereit auch der base url domain der englische Seite

    So sieht der script zur zeit aus:
    #—— start canonical ————-

    lib.canonical = TEXT
    lib.canonical {
    typolink {
    parameter = {page:uid}
    parameter.insertData = 1
    useCacheHash = 1
    # add all get parameters from the current URL
    addQueryString = 1
    addQueryString.method = GET
    addQueryString.exclude = id,L
    # remove the page id from the parameters so it is not inserted twice
    addQueryString.exclude = id
    returnLast = url
    }
    #Eckige Klammern mit spitzen Tag-Klammern ersetzten:
    wrap = [link rel="canonical" href="http://www.deutschseite.com/|" /]
    }
    page.headerData.5 < lib.canonical

    [globalVar = GP:L = 1]
    config.baseURL = http://www.englischeseite.com/
    lib.canonical.typolink.addQueryString.exclude = id
    [global]

    #————— end ————-

    Hat jemand irgendeine Tipp?
    Danke

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>