-
-
Notifications
You must be signed in to change notification settings - Fork 213
Duplicate entry for key 'url' INSERT INTO tl_search #8498
Comments
|
Also dürfen wir nie die leere URL indizieren, wenn |
|
@contao/developers /cc |
|
Oder nur die Fallback Sprache indizieren in so einem Fall. |
IMO ja, denn wenn dieselbe URL zwei verschiedene Seiten/Inhalte liefern kann, darf nichts unter dieser URL indiziert werden. Ist die Seite mit dem Alias |
|
Vielleicht ist das auch ein Fehler im Routing? Denn eigentlich muss der Browser unter der leeren Domain immer dieselbe Seite anzeigen, nämlich das Index-Dokument. |
|
Contao zeigt bei einem leeren Request aber einfach die erste Seite des jeweiligen Seitebaums an. Contao ermittelt also in diesem Fall zuerst den richtigen Seitenbaum anhand der Browser-Sprache und zeigt da die erste (published) Seite an - egal ob die den Alias index hat oder nicht. |
|
Was aber falsch sein könnte, wie wir jetzt durch den hier diskutierten Fehler bemerken. Auch Google zeigt ja nicht unter ein und derselben Domain verschiedene Seiten an, oder? |
|
Google nicht, da die zig lokalisierte Domains haben, aber das -Attribut "lang" wird soweit ich weiß durchaus hinsichtlich duplicated content & Co in Betracht gezogen. So gesehen wäre eine möglich Lösung für unser Problem hier, den Unique Key einfach um eine weitere Spalte für das Sprach-Kürzel zu ergänzen. |
Doch, es heißt ja nicht, dass es einen weiteren Seitenbaum gibt. Hat man nur einen, warum soll ich dann addLanguageToUrl aktivieren? |
|
Google mag ja nur eine Sprache aufnehmen, ist hier aber auch egal. Bräuchte man hier nicht einfach nur die Sprache (language) mit aufnehmen? |
Trotzdem kann man dann aber nicht dediziert unter |
|
Ja, der User-Agent ändert den Content. Aber nichts anderes sagt der vary:User-Agent - Header, der z.B. auch von contao.org ausgesendet wird. Contao macht davon sogar regen Gebrauch, um dem body Klassen zuzuweisen. Nach genauerer Konsultation der Google-Guidelines lag ich mit meiner ersten Einschätzung aber falsch. Google achtet nicht auf <html lang="...", sondern ermittelt die Sprache einer Seite anhand des Contents. SEO-technisch wäre es also falsch, unter "domain.tld/" mehrere verschiedene Sprachen auszuliefern, auch wenn der vary:User-Agent - Header sowas durchaus zu lässt. Auch wenn n zusätzliches Feld im Unique-Key das ursprüngliche Problem beseitigen würde, wäre eine umfassendere Lösung besser. Wie wäre es, wenn bei obigem Szenario (Multi-Lang, kein Lang-Parameter in der URL) beim Aufruf der Domain in einer anderen als der Fallback-Sprache ein Redirect auf domain.tld/sprachstart-alias.html erfolgt? Müsste dann aber n 302 sein, damit Browser den Redirect nicht cachen & Suchmaschinen ihn nicht fest indizieren. |
|
Ich hatte mir schon des öfteren gewünscht den Lang-Parameter bei jeder Sprache AUßER der Fallback-Sprache automatisch in die url hängen zu können - das wäre wohl auch eine Möglichkeit dieses Problem anzugehen. |
So sehe ich das auch.
Entweder so (leere Domain == Fallback-Sprache) oder anhand des Index-Dokuments (leere Domain == Seite mit Alias "index"). Letzteres wäre näher am normalen Verhalten eines Webservers. |
|
Das mit dem Alias "index" setzt aber voraus, dass jeder Webmaster bei der Startseite seiner Fallback-Sprache eben "index" setzt, bzw. überhaupt "index" irgendwo verwendet. Leere Domain = Fallback ist evtl. SEO-technisch und semantisch nicht DIE ultimative Lösung, aber sie gewährleistet Abwärtskompatibilität. |
|
On that note, there are currently 3 URLs for the startpage in Contao:
The |
|
That is not correct. If you open the root page URL, you are being redirected. |
|
True, I remembered that wrong. |
|
This still leaves us 2 options, domain.tld/ and domain.tld/alias.html (if alias != index). From a SEO point of view, this is total garbage if not compensated with a canonical-tag. |
|
As discussed in Mumble on October 6th, we should 302 redirect to the respective root page in this case. Only if there is a page with the alias |
|
Fixed in f42f2a4. The fix also fixes the "Do not redirect empty URLs" feature, which obviously nobody is using, because nobody ever complained that it was broken. 😄 |
i never got what it's used for 😄 |
|
Für die Implementation in Contao 4 können wir Cookies natürlich nicht einfach ignorieren, aber Einführung für entsprechende Vary-Header hab ich mir auf die Fahne geschrieben. Das wird also verbessert werden. Das Problem ist, dass |
|
@contao/developers Soll ich also wirklich das Würde ein |
|
Das stimmt so nicht ganz. Der Inhalt könnte beliebig verändert werden aufgrund eines Cookies. Es ist aber richtig, dass dieser Inhalt dann meistens auch nicht indexiert werden muss. Z.B. ein Warenkorb etc. pp. Aber der Suchindex sollte sich daran auch nicht stören, weil es absolut valid ist, auf derselben URL verschiedenen Inhalt zu haben. Genau dafür ist ja eben der |
|
@Toflar Ich sehe da durchaus ein Problem wenn in diesem Falle dann dummerweise der Cookie-based Content im Index landet und der "richtige" nicht mehr reinkommt und ich nichtmal einen Fehler bekomme. Dass es sich hierbei um ein Fehlverhalten handelt ist, denke ich, unbestritten. Dennoch sollten wir nicht ein Fehlverhalten durch ein anderes tauschen. |
|
Da bin ich ja bei dir, ich hab keine Aussage getroffen, ausser dass es jetzt falsch ist. |
|
Dann habe ich dich falsch verstanden, ich dachte dass du pro Ich bin aus o.g. Grund dagegen. |
|
Imho sollten wir in der 3.5 das Indizieren ignorieren wenn credentialed requests reinkommen. Also sprich |
|
Ah, dann hätten wir keine personalisierten Suchergebnisse mehr. |
|
Exakt, we are doomed. 😺 |
|
Es geht halt einfach nicht. Es ist wieder eins dieser Probleme die sich einfach nicht lösen lassen in 3.5. In der 4 können wir anständige Vary header setzen und dann passt das, dann geht es auch für deinen Crawler. |
|
Die praesentieren aber auch nicht jedem Besucher einen anderen Inhalt sondern jedem denselben? |
|
Das ist ja auch irrelevant. Es geht darum was unsere Suche macht und im Moment geht sie davon aus, dass unter der selben URL immer derselbe Content existiert was ein Fehler ist, denn dem ist einfach nicht so. Die URL ist nie unique. Sie ist unique zusammen mit allen Vary Headern und mit denen kann weder unser Contao 3.5 HTTP-Cache noch unsere Suche umgehen.
Und die hängen am Cookie, man muss sie also erst noch mit Vorab-Requests aufsplitten. Das ist ein riesiger Aufwand. |
|
Zumindest für alle Content-Änderungen, die nicht vom Session-Cookie, sondern x-beliebigen weiteren abhängen (wie z.B. bei der Cookiebar-Extension) gäbe es eine schnelle und nicht all zu hässliche Lösung:
Hilft natürlich nix für Dinge aus der Session, z.B. wenn eine Extension eine sortier- oder filterbare Liste darstellt, die Filter-Einstellungen in der Session lagert und die Liste nicht vom Indexer ausschließt. Aber irgend was ist ja immer... |
|
Is there any plan to accommodate this in a bugfix version in Contao 3? While we identified the problem with extensions likes A Google search still reveals a lot of websites that suffer from this problem - though most of them haven't been updated to the most recent Contao LTS version, otherwise the error would not be visible in the front end. |
|
Imho this needs to be reopened, yes. The only question is whether we should go for |
|
Correct. I have already asked this question on December 15th, 2016, but never got an answer. |
|
Both ways are possibly incorrect, so what. Just pick one :D I think I'd just ignore it. |
|
@Toflar What do you mean regarding ON DUPLICATED KEY UPDATE? The problem here exists because of an UPDATE statement. UPDATE does not have a syntax like UPDATE ON DUPLICATE KEY UPDATE. The only option regarding duplicates is IGNORE. Only INSERT statements support an optional UPDATE. What would happen if we set it to ON DUPLICATE KEY IGNORE and change regular content of the page, e.g. add/modify a content element? Wouldn't in this case the index still contain the old content until someone issues a full reindex from backend? If this is the case, IGNORE is no option at all. I think it's wrong to simply say "Check your extensions". While old extensions might be the reason this problem exists, these extensions were not resulting in this kind of error for older v3.5-releases. Since the core-updates on LTS-release should not result in backward compatibility issues, it is wrong to expect every extension to adapt to the modified search behaviour with checksum_pid. If an extension was working with 3.5.0, it should work with 3.5.999. Oh, and a Google-search for "contao Query error: Duplicate entry" reveals pure horror... |
|
Yeah obviously I mean the update statement.
Yeah, as I said. It's a problem we cannot fix. If your content element provides different output for the same URL based on something like the session, the content changes. You cannot determine which change was correct. We can always update the entry instead of ignoring it but anyway it leads to inconsistent search results no matter what way we choose. |
|
I don’t think this is a problem only with extensions. I can reproduce it reliably in my installation:
This leads to The error with
This leads to I think both cases can be fixed by adding a $objDatabase->prepare("DELETE FROM tl_search WHERE id=?")
->execute($objIndex->id);The comment on this line says “the new URL is more canonical” which IMO means that the old entry should get deleted, so the |
|
Yeah that should improve it already. Still you might have different output on the same URL. The very correct way would be to include |
Yes. |
|
Done: #8647 |
|
@Toflar Even if the Indexer might index wrong/personalized content, removing the fatal error is still a huge improvement. The worst that might happen is: the search result won't match the page it points to, but only until a user clicks on the result. |
|
Sure, the PR fixes the issue. Go test and comment, please :-) |
|
Thank you guys! |
|
Unfortunately this has resurfaced again in a Contao 4.4.12 installation. This website was launched with Contao 4.4 in general. I'll try to analyze the cause. |
Ähnlich dem #8460 .
Contao 3.5.17 hat zwei Seitenbäume, für Sprache de und en bei gleicher Domain.
Die Sprachkürzel in der URL sind nicht aktiviert!
Home Alias bei "de" ist "index", bei "en" ist "home".
Ruft man nun mittels de und en Browser die Home Seiten ohne Alias auf, wird zweimal versucht die Url http://domain.xy/ einzutragen.
The text was updated successfully, but these errors were encountered: