WordPress mit mehr als nur einer URL betreiben
Standardmässig "lauscht" WordPress auf eine einzige URL - nämlich die, die in den Einstellungen als Seiten-URL festgelegt ist. Einer unsere Kunden stellte neulich die Anfrage, dass seine WordPress Seite auf zwei unterschiedlichen URLs erreichbar sein sollte ohne, dass die Adresszeile sich ändert. Das WordPress soll vollständig auf mehreren Domains "lauschen".
Die Domains pointeten schon alle per A-Record auf den Server mit der WordPress Seite und die Domains waren auch alle als ServerName bzw. ServerAlias in der Vhost Config des Apaches eingerichtet. So weit so gut.
Stand jetzt leitete also die neue Domain dann automatisch zu der in WordPress festgelegten URL. Sprich: in der Adresszeile wurde die Domain durch die Hauptdomain ersetzt. Genau das wollte der Kunde ja nicht.
wp-config.php to the rescue!
Da ich auf eine weitere Dependenz in Form eines Plugins verzichten wollte, habe ich ein wenig recherchiert und stieß auf diese WordPress Supportseite. Dass per WP Config die WordPress WP_SITEURL und die WP_HOME per PHP Konstante festgelegt werden konnte war mir zwar bekannt, jedoch habe ich vorher nie drüber nachgedacht, sie mit einer PHP Servervariable zu belegen.
Die Servervariable HTTP_HOST enthält den Inhalt des Host:-Headers des aktuellen Requests. Sprich er gibt die Host-Domain aus.
Surfe ich beispielsweise https://www.pixelbar.be/test an, gibt mir die Variable $_SERVER['HTTP_HOST']
somit pixelbar.be aus.
Per define()
also fix die WP_SITEURL und WP_HOME überschreiben und schauen was passiert:
define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST']);
Und siehe da: die WordPress Seite war out-of-the-box multi-domain fähig. Es benötigte keine weitere Anpassung. Alles funktionierte soweit und auch der PageCache (Cachify) griff auf Anhieb.
Hinweis: ist eure Seite nicht SSL verschlüsselt (was sie sein sollte!), ersetzt das https://
einfach durch http://
.
Das Problem mit dem Duplicate Content
Wir stellten jedoch recht schnell fest, dass wir Probleme mit Suchmaschinen wie Google bekommen würden. Und zwar wegen Duplicate Content.
Sistrix schreibt zu Duplicate Content:
Unter Duplicate Content versteht man doppelte Inhalte, die über mehrere URLs erreichbar sind. Dieser Duplicate Content sollte unbedingt vermieden werden. Der Inhalt einer Seite darf immer nur über eine eindeutige URL erreichbar sein. Duplicate Content stellt Google vor das Problem, welche URL in den Rankings angezeigt werden soll und welche positiven Rankingsignale welcher URL zugeordnet werden.
Zum Glück lässt sich das Problem schnell lösen. Und zwar mit den so genannten Canonical Tags.
SEO-Küche schreibt dazu:
Der Canonical Tag wird eingesetzt, um Webseiten mit doppeltem Inhalt (Duplicate Content) richtig auszuzeichnen. Dieser wird, sobald er von Google erkannt wird, abgestraft. Das heißt, die Seite mit dem sich wiederholenden Inhalt rankt schlechter in den Suchergebnissen. Im Headerbereich des Quelltextes wird er innerhalb eines Link-Elements mit dem Attribut rel=“canonical“ gekennzeichnet. So verlinkt man von einer oder mehreren Kopien einer Website auf das Original. Diese Ursprungsseite wird auch als die „kanonische“ Seite bezeichnet.
Man setzt in den <head> der Website also einen Tag, der die Ursprungsseite dieser Kopie der Seite auszeichnet. Den erkennt Google und straft die Seite dann nicht mehr ab.
Da wir auf all unseren Seiten das YOAST SEO Plugin nutzen, wird der Canonical Tag automatisch mit eingebunden. Dieser wird durch unsere Anpassung oben allerdings mit angepasst und ist somit momentan nutzlos bei der Bekämpfung des Duplicate Contents. Durch einen kleinen Filter haben wir aber die Möglichkeit, die Canonical URL anzupassen.
Fügen wir also dieses Snippet in die functions.php ein und passen es noch ein wenig an:
function pix_change_canonical_to_main_url($url) {
if( strpos($url, 'DEINE-HAUPTDOMAIN.TLD') == false )
$url = str_replace( $_SERVER['HTTP_HOST'], 'DEINE-HAUPTDOMAIN.TLD', $url );
return $url;
}
add_filter( 'wpseo_canonical', 'pix_change_canonical_to_main_url' );
Ersetze hier DEINE-HAUPTDOMAIN.TLD durch die Domain, die als Canonical URL angegeben werden soll.
Fertig. Testest doch mal – ich habe genau diese Snippets auf unserer Seite pixelbar.be Seite eingefügt:
- https://www.pixelbar.be/referenzen/
- https://pixelbar.eu/referenzen/
- https://pixel-bar.be/referenzen/
Alle Seiten sind erreichbar mit dem extakt gleichen Inhalt und die URL in der Adresszeile wird nicht umgeschrieben. Die Canonical URL steht bei allen auf https://www.pixelbar.be/referenzen/.
Das war ja leicht - gibt's sonst was zu beachten?
Um ehrlich zu sein – ich bin selber sehr überrascht darüber wie einfach das einzurichten war und dass ich keine Probleme nach der Umstellung feststellen konnte. Die Canonical URLs sind alle korrekt und die Seite auf allen Domains, die ich auf die Seite pointen lasse erreichbar.
Zugegeben: da wir Plugins nur sehr wenig und bewusst einsetzen, haben wir vielleicht Glück. Advanced Custom Fields funktioniert, der Pagecache per Cachify funktioniert ebenfalls, YOAST funktioniert (die sitemap.xml wird auf beiden URLs korrekt generiert, durch die kleine Anpassung wird die Canonical URL jetzt korrekt ausgegeben…).
Gibt es irgendwelche Probleme oder andere Dinge, die ich eventuell noch nicht bedacht habe? Schreibt sie in die Kommentare! :-)
Hallo Adrian,
das hört sich super an und ist ja nur ganz wenig Aufwand.
Kann man Deiner Meinung nach damit auch ein Staging-System für WordPress aufbauen. Hatte genau mit den fest verdrahteten Links immer Ärger beim Versuch, Testsysteme aufzubauen.
Gruß
Alex
Super Tutorials auf Ihrer Seite! Weiter so!
Vielen Dank für diesen super hilfreichen Beitrag – genau danach habe ich gesucht! Seltsamerweise werden alle Bilder nur in der Domain der Hauptdomain richtig angezeigt. Auf https://www.pixelbar.be/referenzen/ sieht alles spitze aus. Steuere ich die beiden Seiten auf den weiteren 2 Domains https://pixelbar.eu/referenzen/ und https://pixel-bar.be/referenzen/an, so erhalte ich bei allen Bildern in Safari einen „403 Error“, übrigens auch auf iOs (iPhone). Im Firefox und Google Chrome dagegen werden alle Bilder sauber dargestellt. Irgendeine Idee, woran das liegen könnte?
Tausend Dank im Voraus für eine Info, wo hier der Fehler liegt.
PS: Kurioserweise werden die Bilder auch in Safari dann angezeigt, wenn ich einen einzelnen Pfad verwende. Zum Beispiel: https://pixel-bar.be/wp-content/themes/pixelbar/assets/images/pixelbar-logo.jpg wird ohne Probleme angeigt, die Domain https://pixel-bar.be/referenzen ignoriert dagegen alle Bilder!
Hallo, vielen Dank :-)
das Problem mit den Bildern lag an einer eigenen .htaccess Anweisung die das Image Hotlinking deaktiviert. Diese Anweisung ist jetzt raus. :-)
Hallo,
wirklich ein interessanter Ansatz. Gibt es denn einen Weg, jeder Domain eine eigene Startseite und ein eigenes Menü zuzuordnen?
Danke und Gruß!
Ach das ist ja stark!
Wenn ich sowas in der Art machen musste, habe ich stur Redirects genutzt und behauptet es ginge halt nicht anders.
Wobei sich mir persönlich der Need für eine exakt solche Situation nicht ganz erschließt, warum sollte man ein und die selbe Seite auf zwei URLs hörig machen? Erinnert mich etwas an RTL, die für Ihren RTL-NOW Dienst die Seite auf die Intelligenz der Zuschauerschaft hin auch per RTL-NAU erreichbar gemacht haben.
Hallo Adrian,
wenn ich es richtig verstanden habe, muss die wp-config.php und die functions.php geändert werden muss, um die Website mit zwei unterschiedlichen URLs (mit gleichem Inhalt) zu ändern. Muss das Snippet in der functions.php-Datei an einer bestimmten Stelle gesetzt werden? Danke und Gruß, Norbert
Hallo Norbert,
das Snippet für die functions.php kann einfach ganz unten in die functions.php reingesetzt werden.
LG
Hallo Adrian,
vielen Dank für deine Antwort. Ich komme erst jetzt dazu nochmals anzufragen, wie man das Problem angeht.
Also, wenn ich eine Hauptdomain habe, die zum Beispiel
https://regenbogen.de heißt, und diese Seite sollte auch als https://regenbogen.eu gefunden werden, muss quasi dieser Code
define(‚WP_SITEURL‘, ‚https://‘ . $_SERVER[‚HTTP_HOST‘]);
define(‚WP_HOME‘, ‚https://‘ . $_SERVER[‚HTTP_HOST‘]);
in die Datei wp-config.php eingefügt werden. Der Zweizeiler kann dann auch am Ende der PHP-Datei stehen.
Anschließend so verstehe ich, muss das Snippet
function pix_change_canonical_to_main_url($url) {
if( strpos($url, ‚regenbogen.TLD‘) == false )
$url = str_replace( $_SERVER[‚HTTP_HOST‘], ‚regenbogen.TLD‘, $url );
return $url;
}
add_filter( ‚wpseo_canonical‘, ‚pix_change_canonical_to_main_url‘ );
mit der Domain, wie hier im Beispiel durch https://regenbogen.de ersetzt werden.
Die Canonical URL (hier im Beispiel https://regenbogen.eu) muss dann in den Einstellungen von YOAST SEO Plugin eingestellt werden. Was ist denn mit „Man setzt in den der Website also einen Tag, der die Ursprungsseite dieser Kopie der Seite auszeichnet“ gemeint? Und wo muss der Tag eingesetzt werden, bzw. wie muss der Tag lauten?
In meinem Fall gibt es nur für die Hauptdomian ein Sicherheitszertifikat und nicht für die https://regenbogen.eu. Kann das zu Problemen führen?
Vielen Dank für deine Mühe.
Viele Grüße
Norbert
Perfekte Umsetzung und auch Google konform. Gefällt mir sehr gut! Kann ja auch für Länderdomains interessant sein!
Phantastisch – der Beitrag ist für mich eine Art Ei des Columbus! Herzlichen Dank für die gute Beschreibung und das Teilen dieses Lösungsweges.
Hallo Adrian,
danke für deinen Beitrag. Eine Verständnisfrage hätte ich jedoch noch. Wie ist die neue Domain Serverseitig eingerichtet? Die 301 Weiterleitung wurde ja sicher deaktiviert und mit dem A Record wurde bestimmt auf die IP des Servers verwiesen. Doch woher weiß denn nun die Domain zu welchem Webspace Sie auf dem Managed Server gehört? Das Routing ist mir noch nicht ganz klar.
VG Kai
Hallo Kai, sorry für die (sehr) späte Antwort. Der Server muss dementsprechend konfiguriert sein. In unserem Fall sind alle Domains als ServerAliase zu dem eigentlichen ServerName in der Apache Vhost Conf eingetragen. Denn sonst weiss der Server – genau wie du sagst – nicht wie er routen soll.
Vielen Dank für die hilfreiche Anleitung!
Wir verwenden diese Lösung, um eine Seite per Subdomain aufzurufen, bei der der Webserver andere PHP-Einstellungen verwendet; so können wir z.B. die PHP-Execution-Time auf unserer Entwicklungs-Subdomain hochstellen; diese Seite haben wir dann mit einem Passwortschutz versehen. Ebenfalls sehr nützlich, um die Kompatibilität zu neuen PHP-Versionen zu überprüfen ohne dass wir riskieren müssen, dass die Live-Seite nicht mehr erreichbar ist.
In einem spezifischen Fall wird auf der Live-Site Cloudflare eingesetzt, welches auf der Entwicklungs-Domain permanent nicht zum Einsatz kommen soll.
Hallo
Vielen Dank für die tolle Anleitung. Ich habe dies auf meiner Webseite ebenfalls umgesetzt. Es funktioniert soweit auch wie gewünscht. Allerdings habe ich auch das Problem mit den Bildern. Auf der Hauptdomain werden auch die Bilder angezeigt. Auf der Domain welche ich nun mit dieser Anleitung hinzugefügt habe, erscheint die Seite korrekt, auch die Domain in der Adresszeile ist korrekt, aber bei allen Bildern egal auf welcher Seite erscheint eine Meldung „Stop, This Image was hotlinked“ Ich habe gelesen dass dies in der htaccess Datei zu beheben ist. Aber welchen Eintrag muss ich dort löschen oder anpassen? Vielen Dank für die Rückmeldung.
Vielen Dank!
Zu deiner Frage: das lässt sich pauschal nicht beantworten, dafür müssten wir den Inhalt der htaccess Datei mal sehen :-)
Moin,
ich schlage mich grad noch mit einem Folgeproblem herum. Wenn ich also mit relativen Domains arbeite, wie kann ich dann diese in einem Link referenzieren.
https://$_SERVER[\’HTTP_HOST\‘]/impressum ergibt ja nun keinen Sinn.
Wie könnte ich Links mit Bezug zur aufrufenden Domain generieren.
Beispiel:
meine-domain.de Verweist über einen Link auf meine-domain.de/shop – zwei unterschiedliche Instanzen. Oder benen .fr, .eu. Wie kann ich dann von meine-domain/shop wieder auf die Aufrufende Domain verweisen?
Gruß
Wolfram
Toller Beitrag und gut erklärt. Habt Ihr auch irgendeine Idee, wie das bei einer Hauptseite einer Multisite umzusetzen ist? Denn Fall habe ich, aber keine Möglichkeit, das ohne „Premium“-Plugins umzusetzen.
LG
Rico
Erstmal vielen Dank für die wirklich gelungene Anleitung. Darf ich die „blöde“ Frage stellen, in welche „functions.php“ muss das Snippet eingesetzt werden? Wir haben die folgenden functions.php’s:
…wp-content/plugins/contact-form-7/includes/functions.php
…wp-content/plugins/cookie-notice/includes/functions.php
…wp-content/plugins/wordpress-seo/src/functions.php
…wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/functions.php
…wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/functions.php
…wp-content/plugins/wp-mail-smtp/vendor/woocommerce/action-scheduler/deprecated/functions.php
…wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/guzzle/src/functions.php
…wp-content/plugins/wp-mail-smtp/vendor_prefixed/guzzlehttp/promises/src/functions.php
…wp-content/themes/astra/functions.php
…wp-content/themes/twentytwentyfour/functions.php
…wp-content/themes/twentytwentyone/functions.php
…wp-content/themes/twentytwentytwo/functions.php
…wp-includes/functions.php
@Horst Eberlein:
In eine der folgenden:
…wp-content/themes/astra/functions.php
…wp-content/themes/twentytwentyfour/functions.php
…wp-content/themes/twentytwentyone/functions.php
…wp-content/themes/twentytwentytwo/functions.php
Welche davon, hängt davon ab, welches dieser Themes ihr in der WordPress-Installation aktiviert habt (bei dem muss es rein). Wenn ihr das dort allerdings einfach so einfügt, wird es beim nächsten Update des Themes höchstwahrscheinlich überschrieben. Ihr müsstet euch daher erst ein Child-Theme erstellen. Siehe dazu folgende Anleitung: https://www.webtimiser.de/wordpress-child-theme-erstellen/
n’abend, coole sache!
ich bastele gerade für einen bekannten eine webseite, die unter mehreren domains aufrufbar sein soll – hab gedanklich erst mit einer multisite gespielt, funktioniert aber nicht so wie es soll.
dein tipp klappt insofern wirklich gut, dass die aufgerufene domain in der adresszeile stehen bleibt.
danke dafür.
als nicht-php’ler aber noch eine frage:
wie erreiche ich es, dass statt der startseite der hauptdomain bei eingabe einer der zweit-domains eine unterseite aufgerufen wird?
warum das ganze: mein bekannter bietet seine dienstleistung in mehreren städten an und besitzt insofern die passenden domains. die angezeigte webseite soll an sich (fast) immer die gleiche sein, nur halt mit bezug auf die stadt, die mit der spezifischen domain aufgerufen wird…
wenn du ne idee hast, würd ich mich über feedback freuen :-)
grüße aus hannover
andreas
Toller Beitrag, da ich genau danach gesucht habe. Nachdem ich den Code in die ensprechende Datei eingefügt habe, wird meine 2.te URL weiterhin duch die Hauptdomain ersetzt. Ich nehme an, das es an meinem Provider liegt, bzw. ich nicht weiß was man bei Strato.de einstellen soll. Hier wird von einem anderen Provider gesprochen. Kann mir jemand dabei helfen?