Lass das canonical Tag da aussehen wie es will, das liest niemand. Der HTTP Status ist 404, damit ist die Geschichte da nach allen normalen Regeln zuende. Hab ich gecheckt, der Status ist korrekt 404.
Das ist ein regulärer Ausdruck. Da das nicht extra als "beginnt mit" gekennzeichnet ist reicht ein vorkommen irgendwo um zu matchen. Der Ländercode ist kein Ländercode sondern ein Sprachcode. Ländercodes haben wir nicht in der URL. Der setzt die Sprache. Wenn die Regel angewendet wird, gibts keinen Ländercode mehr in den URLs, also kommt die Standardsprache.
Also ich würde mal zeitweise in der /system/overloads/HeaderExtenderComponent/SeoTagsHeaderExtender.inc.php mal per preg_replace() alle %2525253Flanguage=en und %2525253Flanguage und %2525253Dde und %2525253Flanguage%2525253Den rausbasteln. Holzhammer. Oder mal zeitweise ALLE Parameter abschneiden.
Möglich, dass bei den 603 da Fälle bei sind. Aber bei den genannten Beispiel-URLs müsste das passen. https://www.phiessences.com/en/Anim...language%3Des%3Flanguage%3Den%3Flanguage%3Dfr wird weitergeleitet auf https://www.phiessences.com/en/Animal-Essences/European-Animal-Essences/16--Ibex.html Sprache ist weiterhin englisch. Das hat gar nicht explizit mit dem Parameter zu tun. Die Bedingung greift auch bei z.B. "?blanguage=".
Ja wundert mich gerade auch. Sehr eigenartig. 404 funktioniert nicht. Mit freundlichen Grüßen aus den Niederlanden
Guten Morgen, wo finde ich nochmal den Button für die Link-Reparatur im Gambio-Admin, das Layout hat sich geändert.
Unter "SEO". Aber das ist jetzt die einzige Antwort auf die ganzen Tipps, Hilfen und Hinweise? Konntest du das Problem lösen? Hat dir die Sache von Dominik geholfen? Oder bist du meinen Weg gegangen?
Hallo, vielen Dank für die Rückmeldung. Ich hab das in SEO nicht gefunden ( Urls reparieren )... Bezüglich der htacces komm ich nicht weiter, da ich ich mich in dem Bereich nicht so gut auskenne. Die auch angesprochene Datei: SeoTagsHeaderExtender.inc.php hab ich mir per SFTP angeschaut, diese komischen URLS sind darin nicht enthalten: %2525253Flanguage=en und %2525253Flanguage und %2525253Dde und %2525253Flanguage%2525253Den Inhalt von der: SeoTagsHeaderExtender.inc.php <?php /* -------------------------------------------------------------- SeoTagsHeaderExtender.inc.php 2019-08-22 Gambio GmbH http://www.gambio.de Copyright (c) 2019 Gambio GmbH Released under the GNU General Public License (Version 2) [http://www.gnu.org/licenses/gpl-2.0.html] -------------------------------------------------------------- */ /** * Class SeoTagsHeaderExtender * * Determines output of canonical links, alternate links and prev/next links. * * Please also refer to SeoTagsDataProvider. * */ class SeoTagsHeaderExtender extends SeoTagsHeaderExtender_parent { /** @var \GMSEOBoost_ORIGIN */ protected $seoBoost; /** @var \LanguageProviderInterface */ protected $languageProvider; /** @var \KeyValueCollection */ protected $activeCodes; /** @var \LanguageCode */ protected $languageCode; /** @var \LanguageCode */ protected $defaultLangCode; /** @var bool */ protected $indexedPage = true; /** @var bool */ protected $followLinks = true; /** @var array */ protected $excludeGetParams; /** @var array */ protected $noIndexKeys; /** @var array */ protected $noIndexKeysPerPageType; /** @var array */ protected $noFollowKeysPerPageType; /** @var array */ protected $noRelPrevNext; /** @var array */ protected $noCanonicalFiles; /** @var array */ protected $excludeKeysFromCanonical; /** @var array */ protected $excludeKeysFromCanonicalPerPageType; public function proceed() { parent:roceed(); $this->excludeGetParams = SeoTagsDataProvider::getExcludeGetParams(); $this->noIndexKeys = SeoTagsDataProvider::getNoIndexKeys(); $this->noIndexKeysPerPageType = SeoTagsDataProvider::getNoIndexKeysPerPageType(); $this->noFollowKeysPerPageType = SeoTagsDataProvider::getNoFollowKeysPerPageType(); $this->noRelPrevNext = SeoTagsDataProvider::getNoRelPrevNext(); $this->noCanonicalFiles = SeoTagsDataProvider::getNoCanonicalFiles(); $this->excludeKeysFromCanonical = SeoTagsDataProvider::getExcludeKeysFromCanonical(); $this->excludeKeysFromCanonicalPerPageType = SeoTagsDataProvider::getExcludeKeysFromCanonicalPerPageType(); $db = StaticGXCoreLoader::getDatabaseQueryBuilder(); /** @var \GMSEOBoost_ORIGIN $seoBoost */ $this->seoBoost = MainFactory::create_object('GMSEOBoost', [], true); $this->languageCode = new LanguageCode(new StringType(strtoupper($_SESSION['language_code']))); $this->languageProvider = MainFactory::create('LanguageProvider', StaticGXCoreLoader::getDatabaseQueryBuilder()); $this->activeCodes = $this->languageProvider->getActiveCodes(); $this->defaultLangCode = $this->languageProvider->getDefaultLanguageCode(); $allowedGetKeys = array_diff(array_keys($_GET), $this->excludeGetParams); $this->indexedPage = count(array_intersect($this->noIndexKeys, $allowedGetKeys)) === 0; $isProductPage = isset($GLOBALS['product']) && $GLOBALS['product']->isProduct === true; $isCategoryPage = isset($_GET['cat'], $GLOBALS['current_category_id']) && !empty($GLOBALS['current_category_id']); $isContentPage = (!empty($_GET['coID']) && strpos($GLOBALS['PHP_SELF'], '/shop_content.php') !== false); $isIndexPage = stripos(gm_get_env_info('PHP_SELF'), 'index.php') !== false; $useBoostedLanguageCode = gm_get_conf('USE_SEO_BOOST_LANGUAGE_CODE') === 'true'; $devMode = file_exists(DIR_FS_CATALOG . '/.dev-environment'); if($devMode) { header('X-SeoTags-Debug: ' . sprintf('product %s cat %s content %s index %s boosted %s', var_export($isProductPage, true), var_export($isCategoryPage, true), var_export($isContentPage, true), var_export($isIndexPage, true), var_export($useBoostedLanguageCode, true))); header('X-SeoTags-GetArray: ' . implode(',', $allowedGetKeys)); header('X-SeoTags-Get: ' . http_build_query($_GET)); } if($isProductPage) { $pageHtml = $this->getProductPageHtml(); $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['product'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['product'])) === 0; } elseif($isCategoryPage) { $pageHtml = $this->getCategoryPageHtml(); $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['category'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['category'])) === 0; } elseif($isContentPage) { $pageHtml = $this->getContentPageHtml(); $robotsRow = $db->select('gm_robots_entry') ->get_where('content_manager', ['content_group' => (int)$_GET['coID'], 'languages_id' => (int)$_SESSION['languages_id']] )->row_array(); if((int)$robotsRow['gm_robots_entry'] === 1) { $this->indexedPage = false; } $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['content'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['content'])) === 0; } elseif($isIndexPage) { $pageHtml = $this->getIndexPageHtml(); $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['index'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['index'])) === 0; } elseif($useBoostedLanguageCode) { $pageHtml = $this->getBoostedLanguageCodeHtml(); $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['boosted'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['boosted'])) === 0; } else { $pageHtml = $this->getOtherHtml(); $this->indexedPage = $this->indexedPage && count(array_intersect(array_keys($_GET), $this->noIndexKeysPerPageType['other'])) === 0; $this->followLinks = $this->followLinks && count(array_intersect(array_keys($_GET), $this->noFollowKeysPerPageType['other'])) === 0; } if($this->indexedPage === true) { $noIndexFiles = SeoTagsDataProvider::getNoIndexFiles(); foreach($noIndexFiles as $noIndexFile) { if(strpos($_SERVER['REQUEST_URI'], $noIndexFile) !== false) { $this->indexedPage = false; break; } }
Ja, das sehe ich als Problem. Aber das sind ja die Parameter die im Index sind und die es jetzt erstmal als Notlösung aus der canonical URL rausgeworden werden müssen, oder? Damit der Bot jetzt nicht bei jedem Besuch noch darin bestärkt wird, dass er genau die richtige URL aufruft? Also @PHI ich bin kein Experte, aber was ich jetzt probieren würde, (ohne Garantie): In der GXMainComponents\Shared\SeoTagsDataProvider.inc.php dies hier suchen: Code: public static function getExcludeGetParams() { return [ 'cat', 'coID', 'cPath', 'gm_boosted_category', 'gm_boosted_content', 'gm_boosted_product', 'info', 'language', 'products_id', 'products_qty', 'ycr', 'yc' ]; } und hierdurch ersetzen: Code: public static function getExcludeGetParams() { return [ 'cat', 'coID', 'cPath', 'gm_boosted_category', 'gm_boosted_content', 'gm_boosted_product', 'info', 'language', 'products_id', 'products_qty', 'ycr', '%253Flanguage', 'yc' ]; } Dann mal alle Caches leeren und schauen, wie die canonical URL bei Aufruf dieser Seite hier aussieht: (Link nur für registrierte Nutzer sichtbar.) Wenn daraus dann (Link nur für registrierte Nutzer sichtbar.) geworden ist, ist schon viel gewonnen, denke ich. Vor dem Ausprobieren bitte die Datei sichern und bei Problemen die Sicherung wieder einspielen. Wenn du es ausprobiert hast, sag mal Bescheid, dann schaue ich auch nochmal in den Quelltext... Aber ansonsten kann bestimmt Dominik Späte dir auch gegen Bezahlung einen Fix machen, vermute ich.
Ja, das wäre m.E. effektiv. Wäre mir aber zu kompliziert. Deshalb würde ich den einfachen Ansatz der 301er-Weiterleitung vorziehen. Nein, kein Interesse. Aber danke
Hallo, vielen Dank, hab die Zeile '%253Flanguage', hinzugefügt und all Caches gelöscht. Der Canonical ist immer noch falsch.
Probier mal, ob '?language' was bringt. (Ist etwas geraten, ich bin gerade nicht ganz sicher, wie dieser kaputte URL in PHP ankommt.)
Dann vielleicht mal dies hier ersetzen? Code: public static function getExcludeKeysFromCanonical() { return [ 'page', ]; } mit Code: public static function getExcludeKeysFromCanonical() { return [ 'page', '%253Flanguage', 'language', '?language', ]; }
@PHI noch ein gut gemeinter Hinweis Off Topic: In Deutschland musst du für Flüssigkeiten einen Grundpreis (z.B. pro 100 ml oder pro l o.ä.) angeben. Das kann man für jeden Artikel einzeln im Admin bei den Grundpreisen machen. Und man muss auf die EU-Streitschlichtungsplattform verlinken, z.B. vom Impressum aus: (Link nur für registrierte Nutzer sichtbar.) Und bei der MwSt geht bei dir was gar nicht. Wenn ich was in den Warenkorb lege und Deutschland als LIeferland auswähle, wird 9 % MwSt und zusätzlich nochmal 21 % MwSt ausgewiesen. Da scheint was bei deinen Länder- und Steuereinstellungen auch was ganz kaputt zu sein. Ich würde dafür mal ein Ticket bei Gambio einreichen.