Zur Navigation

Nach Umschreibung auf gewünschte URLs nur 404-Fehlerseite

1 Burkhard (Gast)

Hallo.

Ich habe hier schon viel gelesen und auch Anregungen gefunden, die mir weiterhalfen.

Die Tags aus einer Tagwolke in einem Blogsystem sind verlinkt über ein Perl-Suchskript search.cgi in folgender Form:

https://www.domain.de/suche/search.cgi?IncludeBlogs=1&tag=Frankfurt&limit=50
https://www.domain.de/suche/search.cgi?IncludeBlogs=1&tag=Ethik&limit=50
https://www.domain.de/suche/search.cgi?IncludeBlogs=1&tag=Estland&limit=50
usw.
Beim Klick auf diese (mehrere hundert) Links sucht das Skript alle mit dem jeweiligen Tag versehenen Beiträge und gibt diese in einer Liste aus.


Die Links oben sind allerdings nicht so eingängig, also habe ich mit Hilfe der hier im Forum gefunden Diskussionen folgende
URL-Umschreibung hinbekommen:

https://www.domain.de/Frankfurt
https://www.domain.de/Ethik
https://www.domain.de/Estland

Genauso wollte ich das auch haben.
ABER: Jetzt habe ich zwar diese gewünschten URLs, es resultiert jedoch eine 404-Fehlerseite, bzw. keine Suchergebnis-Liste mehr.


So beginnt meine .htaccess-Datei:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^www\.domain\.de$ [OR]
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)$ https://www.domain.de/$1 [R=301,L]

RewriteCond %{QUERY_STRING} (.*(?:^|&))tag=([^&]*)&?(.*)&?$
#RewriteRule (.*)            $1/%2/? [L,R=302,NC]
RewriteRule ^.*$         $1/%2/? [L,R=302,NC]

Könnt ihr mir bei der Lösung behilflich sein? Habt ihr eine Idee, warum das Suchskript offenbar nicht mehr ausgeführt, bzw. gefunden wird?
Vielen Dank für Tipps!

Burkhard

27.08.2019 20:01

2 Jörg Kruse

ABER: Jetzt habe ich zwar diese gewünschten URLs, es resultiert jedoch eine 404-Fehlerseite, bzw. keine Suchergebnis-Liste mehr.

Ja, dort befindet sich ja auch nichts, die Suchscripte sind weiterhin nur unter ihrer Original-URL verfügbar. Um das zu ändern, müsstest du die Kurz-URLs intern auf die Suchscript-URLs umschreiben. Hier gibt es aber zwei Fußangeln, auf die du achtgeben musst:

1. du musst das Muster so erstellen, dass nur Pfade mit den Suchbegriffen von diesem erfasst werden. Falls es keine anderen (Nicht-Kurz-)URLs gibt, deren Pfad nur aus Buchstaben besteht, könnte man vielleicht ^([A-Za-z])$ als Muster nehmen:

RewriteRule ^([A-Za-z])$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50

Falls auch andere URLs hiervon unerwünschter Weise erfasst werden, könntest du dich auch auf die wichtigsten Begriffe beschränken:

RewriteRule ^(Frankfurt|Estland|Ethik)$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50

2. wenn du zusätzlich wie oben in deinem Code vom Such-Script auf die Kurz-URL weiterleitest, musst du Vorsorge treffen, dass hieraus keine Endlosweiterleitung resultiert.

27.08.2019 21:02 | geändert: 27.08.2019 21:08

3 Burkhard (Gast)

Hallo Jörg,
vielen Dank für deine Antwort.
Als Unterscheidungsmerkmal für die Tag-Begriffe habe ich eigentlich nur den Pfad zum Suchskript plus den jeweiligen Begriff (es sind über 4000 Tags, die z.T. auch aus Long-Tails mit Umlauten bestehen, z.B "Kommunikation mit dem Gegenüber"). Daher dürfte deine Antwort 1. b) vermutlich ausscheiden. Trotzdem danke.

Das Muster

suche/search.cgi?IncludeBlogs=1&tag=VAR&limit=50

ist immer gleich, nur VAR ändert sich und kann Groß- / Kleinbuchstaben, Zahlen, Umlaute, Leer- und (meist versehentlich) Sonderzeichen enthalten.Also eigentlich alles.

Mein Gedanke war, den Inhalt von VAR als (virtuellen) Verzeichnisnamen zu benutzen und darunter die eingangs erwähnte Ergebnisliste auszugeben.

Ad.2. Und ja, die Begriffe kommen überall auf der Webseite vor (weil es ja Tags sind, die den Inhalt schlagwortartig wiedergeben sollen), natürlich auch in anderen Links. Daran hatte ich gar nicht gedacht. Na, das wird was.
Besten Dank !
Burkhard

27.08.2019 22:36

4 Jörg Kruse

Wenn du noch ein kleines eindeutiges Unterscheidungsmerkmal mit in die Kurz-URL einbaust, wie z.B. ein virtuelles Verzeichnis /s/, dann läuftst du nicht Gefahr, andere URLs mit zu rewriten:

https://example.com/s/Frankfurt

RewriteRule ^s/(.+)$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50

Ist vielleicht nicht ganz so schick, dafür ist Problem Nr. 1 sicher gelöst.

27.08.2019 22:49

5 Burkhard (Gast)

Hallo nochmal Jörg,
vielen Dank für deine Hilfe.
Ich habe jetzt probiert:

RewriteCond %{QUERY_STRING} (.*(?:^|&))tag=([^&]*)&?(.*)&?$
RewriteRule ^s/(.+)$ suche/search.cgi?IncludeBlogs=1&tag=$&limit=200 [R=302]

Das bringt die Ergebnisliste wie gehabt, aber leider auch die URL mit dem Pfad

suche/search.cgi?IncludeBlogs=1&tag=$&limit=200

die ich ja eigentlich ändern wollte.Was mache ich nur falsch?
Burkhard

27.08.2019 23:33

6 Jörg Kruse

Mir scheint, dir ist noch nicht ganz klar, dass du hier zwei Rewrites benötigst:

1. zuerst sollte unter der Kurz-URL das Suchscript verfügbar gemacht werden, so dass dort kein Fehler 404 mehr erscheint. Dazu muss die Kurz-URL intern auf die Suchscript-URL umgeleitet werden. Mit dem Weiterleitungs-Flag [R=302] leitest du aber extern weiter! zudem macht die RewriteCond hier keinen Sinn: die Kurz-URL hat ja eben keinen Query String.

Die interne Umleitung realisierst du mit dem Beispiel-Code in Beitrag 4, d.h. ohne RewriteCond und ohne Weiterleitungs-Flag. Wenn du dann https://example.com/s/Frankfurt im Browser aufrufst, sollte das Suchscript mit dem Suchbegriff "Frankfurt" angezeigt werden

2. sobald du 1. erfolgreich umgesetzt hast, kannst du die Suchscript-URL auf die nun "funktionierende" Kurz-URL weiterleiten. Hierbei musst du aber wie gesagt einer Endlosweiterleitung vorbeugen:

https://jkip.de/howtos/endlos-weiterleitung

Ein anderes Beispiel für 1. und 2. ist auch in diesem Blogartikel beschrieben:

https://blog.jkip.de/archiv/n-2009-10/rewrite-redirect.html

Besser ist es zudem, wenn die Links, soweit möglich, angepasst werden, so dass sie nun direkt auf die Kurz-URLs verweisen.

28.08.2019 09:09 | geändert: 28.08.2019 09:15

7 Burkhard (Gast)

Hallo Jörg.

Nochmals danke. Ich dachte tatsächlich, dass mit einer Regel das Umschreiben und das Weiterleiten zu bewerkstelligen sein muss.
Verstanden habe ich, dass ich mit

RewriteRule ^s/(.+)$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50

das cgi-Skript und der neuen URL domain.de/s/$1 verfügbar machen muss.
Das klappt auch: domain.de/s/Frankfurt gibt jetzt die Ergebnisliste aus.

Richtig verstanden habe ich hoffentlich auch, dass ich das bisherige (alte) Skript

suche/search.cgi?IncludeBlogs=1&tag=VAR1&limit=50

jetzt auf die neue virtuelle URL domain.de/s/VAR umleiten muss.
Dazu kann ich doch meinen funktionierenden Query-String herbei nehmen

RewriteCond %{QUERY_STRING} (.*(?:^|&))tag=([^&]*)&?(.*)&?$

Falls ich es richtig sehe, ist der Ausdruck der ersten Gesamtklammer jetzt in %1, der zweite in %2 und der dritte in %3 verfügbar.
Da mich für die Umleitung nur der Inhalt von %2 (das müsste das Tag, bzw. der Suchbegriff sein) interessiert,
sollte die neue Regel dann

RewriteRule ^s/.*$ suche/search.cgi?IncludeBlogs=1&tag=%2&limit=50/? [R=301,L,NC]

lauten. Und da ist sie dann endlich... Die Endlosschleife. Und aus der komme ich trotz der Request-Prüfung
nicht wieder raus.

RewriteCond %{THE_REQUEST} \?IncludeBlogs=1&tag=
RewriteRule ^s/(.+)$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50
RewriteCond %{QUERY_STRING} (.*(?:^|&))tag=([^&]*)&?(.*)&?$
RewriteRule ^suche/search\.cgi$  https://www.domain.de/s/%2? [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^s/?(.+)$ suche/search.cgi?tag=$1

Wie kann ich den Fehler erkennen?

Burkhard

28.08.2019 16:27

8 Jörg Kruse

Die Request-Prüfung bezieht sich nur auf die folgende RewriteRule, nicht auf die danach folgende Weiterleitung.

Leer mal den Browser-Cache und probier dann so:

# weiterleiten
RewriteCond %{THE_REQUEST} /suche/search\.cgi
RewriteCond %{QUERY_STRING} &?tag=([^&]+)
RewriteRule ^suche/search\.cgi$  https://www.domain.de/s/%1? [R=301,L]

# intern umleiten
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^s/(.+)$ suche/search.cgi?IncludeBlogs=1&tag=$1&limit=50

28.08.2019 16:41

9 Burkhard (Gast)

Hallo Jörg,

ich bin sprachlos. Es funktioniert. Frei nach dem Motto: Kaum macht man alles richtig, schon geht's. Die Ergebnis-URLs bei den Long-Tail-Begriffen sind jetzt zwar URL-encoded, aber das ist - glaube ich - auch korrekt so.
Ganz herzlichen Dank für die Hilfestellungen!

Grüße Burkhard

28.08.2019 22:21

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]