Nick: mod_rewrite: Trailing Slash und Weiterleitung

Hallo!

RewriteEngine On
RewriteRule ^artikelnummer/(.*)/$ index.php?artikelnummer=$1 [L]

Dies als Inhalt einer .htaccess-Datei führt dazu, dass die Ressource

http://example.org/index.php?artikelnummer=123

auch unter

http://example.org/artikelnummer/123

sowie unter

http://example.org/artikelnummer/123/

abgerufen werden kann.

Wie erreiche ich eine permanente Weiterleitung (301 Redirect) von

http://example.org/index.php?artikelnummer=123

sowie von

http://example.org/artikelnummer/123

auf

http://example.org/artikelnummer/123/

so dass die Ressource nur unter dieser URL abrufbar ist?

Viele Grüße
Nick

  1. PS:

    Auch

    http://example.org//index.php?artikelnummer=123

    bzw.

    http://example.org///Tindex.php?artikelnummer=123

    etc. und

    http://example.org//artikelnummer/123

    bzw.

    http://example.org//artikelnummer//123

    etc. sowie

    http://example.org//artikelnummer/123/

    bzw.

    http://example.org/artikelnummer//123/

    etc. sollen permanent auf

    http://example.org/artikelnummer/123/

    weiterleiten.

  2. hi,

    so dass die Ressource nur unter dieser URL abrufbar ist?

    wenn Du eindeutige URLs haben willst, brauchst Du eine Tabelle, wo die alle drinstehen.

    Hotti

    1. wenn Du eindeutige URLs haben willst, brauchst Du eine Tabelle, wo die alle drinstehen.

      Keine Chance über mod_rewrite und reguläre Ausdrücke?

      1. wenn Du eindeutige URLs haben willst, brauchst Du eine Tabelle, wo die alle drinstehen.

        Keine Chance über mod_rewrite und reguläre Ausdrücke?

        Dazu fragst Du den Falschen ;) Nur soviel: Mit der gewünschten Weiterleitung wird das nicht besser und das Problem löst es nicht. Hinter einer Weiterleitung stecken auch mindestens zwei URLs, nurmalso nebenbei.

        Rewrite-ja. Es unterstützt grundsätzlich den Wunsch nach dynamischen Inhalten. Die gesamte Site jedoch, sollte auf einer fundierten Projektverwaltung stehen, schließlich gehören zu jeder Einzelseite eine ganze Palette an Meta-Angaben (Buzzwort: Attribute) und die gehören ordentlich verwaltet. Mit der Rewrite-Engine wird das Ganze nur auf ein Master-Script gebeamt, was den Zauber dann ausgibt. Damit stehen Dir alle Wege offen.

        Hotti

        PS: 404 Not Found weil Slash am Ende.

        1. Dazu fragst Du den Falschen ;) Nur soviel: Mit der gewünschten Weiterleitung wird das nicht besser und das Problem löst es nicht. Hinter einer Weiterleitung stecken auch mindestens zwei URLs, nurmalso nebenbei.

          Wieso wird es nicht besser und löst das Problem nicht?

          PS: 404 Not Found weil Slash am Ende.

          Und?

          1. hi,

            Wieso wird es nicht besser und löst das Problem nicht?

            Du bekommst damit keine eindeutigen URLs.

            PS: 404 Not Found weil Slash am Ende.

            Und?

            Das arbeitet so, wie ich weiter oben beschrieben habe, der URL funktioniert ohne abschließenden Slash, ein Solcher erzeugt den Status 404, korrekt und zielführend. Deiner Fragestellung nach schien es Dich zu interessieren.

            Und noch einen Tipp: Die .htaccess ist zum Konfigurieren des Webservers.

            Hotti

            1. Du bekommst damit keine eindeutigen URLs.

              Mir geht es darum, dass die anderen gültigen Varianten auf eine einzige Variante umgeleitet werden (301 Redirect).

              Das arbeitet so, wie ich weiter oben beschrieben habe, der URL funktioniert ohne abschließenden Slash, ein Solcher erzeugt den Status 404, korrekt und zielführend. Deiner Fragestellung nach schien es Dich zu interessieren.

              Aber ob man sich jetzt für die Variante mit oder ohne Slash am Ende entscheidet, ist doch Geschmackssache.

              Und noch einen Tipp: Die .htaccess ist zum Konfigurieren des Webservers.

              Sorry, hier muss ich wieder ganz blöd fragen: und?

              1. hi,

                Aber ob man sich jetzt für die Variante mit oder ohne Slash am Ende entscheidet, ist doch Geschmackssache.

                Nicht ganz. Im Default, dem allgemeinen Verständnis der Besucher entsprechend, bedeutet ein Slash am Ende, dass es sich um ein Verzeichnis handelt und der Webserver die zum Verzeichnis gehörige Index-Datei (_default: index.html {konfigurierbar}) ausliefert (*).

                Und noch einen Tipp: Die .htaccess ist zum Konfigurieren des Webservers.

                Sorry, hier muss ich wieder ganz blöd fragen: und?

                Is ne gute Frage, meine Meinung dazu habe ich schon weiter oben kundgetan: Rewrite unterstützt die Ausgabe von dynamischen Content, mehr nicht. Ich ziehe hier eine klare Trennung, d.h., die Anwendung bekommt von Rewrite lediglich die Requested URLs zugespielt, die Konfiguration selbst ist Sache der Anwendung, die auch dafür zuständig ist, dass URLs eindeutig sind und dass im Fall einer nicht vorhandenen angeforderten Ressource der richtige HTTP-Status ausgegeben wird.

                (*) Ich finde ich diese Konvention gut, meine Anwendungen bauen darauf auf. Im Code sowie in der Anwendungs-Konfiguration ergeben sich damit auch klare Verhältnisse.

                Hotti

  3. Moin!

    Wie erreiche ich eine permanente Weiterleitung (301 Redirect) von

    http://example.org/index.php?artikelnummer=123

    sowie von

    http://example.org/artikelnummer/123

    auf

    http://example.org/artikelnummer/123/

    so dass die Ressource nur unter dieser URL abrufbar ist?

    Das ist sie ja nicht. Redirects sind gültige Antworten auf Fragen, wenn eine Ressource "NUR" unter einer bestimmten URL abrufbar sein sollte, müssten alle anderen Ressourcen mit 404 antworten.

    Insofern wäre die Frage, warum du diesen Redirect zu benötigen glaubst. Verlinke in deiner Site ausschließlich die eine, gewünschte Variante der URL, und schon werden die Requests auf alle anderen Varianten gegen Null gehen - Mission erfüllt.

    Ach ja: Google kennt auch dieses nicht untypische Problem von Websites und sieht es nicht als "Duplicate Content" an - gibt einfach die "canonical url" in deiner Seite an, um jegliche Zweideutigkeiten seitens Google auszuschließen und die von dir gewünschte Variante der URL anzugeben.

    - Sven Rautenberg

    1. Das ist sie ja nicht. Redirects sind gültige Antworten auf Fragen, wenn eine Ressource "NUR" unter einer bestimmten URL abrufbar sein sollte, müssten alle anderen Ressourcen mit 404 antworten.

      Dann war meine Formulierung offenbar falsch, aber es dürfte dennoch klar geworden sein, was ich gemeint habe.

      Insofern wäre die Frage, warum du diesen Redirect zu benötigen glaubst. Verlinke in deiner Site ausschließlich die eine, gewünschte Variante der URL, und schon werden die Requests auf alle anderen Varianten gegen Null gehen - Mission erfüllt.

      Ach ja: Google kennt auch dieses nicht untypische Problem von Websites und sieht es nicht als "Duplicate Content" an - gibt einfach die "canonical url" in deiner Seite an, um jegliche Zweideutigkeiten seitens Google auszuschließen und die von dir gewünschte Variante der URL anzugeben.

      Das ist nicht die Art von "Lösung", nach der ich suche.

  4. RewriteRule: /artikelnummer/ gefolgt von Zahl, gefolgt von Slash ODER index.php?artikelnummer= gefolgt von Zahl -> leite um auf /artikelnummer/ gefolgt von gefundener Zahl

    Sollte recht einfach als 1-Zeiler umzusetzen sein - sofern man jetzt von den Hinweisen von Sven oder hotti absieht. Wobei hottis vorschlag vermutlich unsinnig ist, wenn sich die Artikelnummern nicht ändern. Wenn du hingegen mal auf sprechende URLs umstellst - z.B. statt /artikelnummer/123 auf /produkte/toller-rasenmaeher - wird es dir nicht erspaart bleiben, eine Tabelle anzulegen.

    Wenn das Produkt umbenannt wird (und sei es nur, weil sich jemand vertippt hat) kannst du mit ModRewrite automatisiert mit einer einfachen Regel nichts mehr anfangen.

    1. RewriteRule: /artikelnummer/ gefolgt von Zahl, gefolgt von Slash ODER index.php?artikelnummer= gefolgt von Zahl -> leite um auf /artikelnummer/ gefolgt von gefundener Zahl

      So ähnlich.

      Sollte recht einfach als 1-Zeiler umzusetzen sein - sofern man jetzt von den Hinweisen von Sven oder hotti absieht.

      Dann mach doch mal bitte einen Vorschlag.

      1. RewriteRule: /artikelnummer/ gefolgt von Zahl, gefolgt von Slash ODER index.php?artikelnummer= gefolgt von Zahl -> leite um auf /artikelnummer/ gefolgt von gefundener Zahl

        So ähnlich.

        Wie genau? Das ist der erste Schritt, wenn du einen regulären Ausdruck verfasst.

        Dann mach doch mal bitte einen Vorschlag.

        Hab' ich doch schon :)

        Versuch' doch einfach mal, meinen entsprechenden Vorschlag in einen regulären Ausdruck zu fassen - wenn du irgendwo stecken bleibst, einfach nochmal melden.

        Wenn dir den Ausdruck jetzt bastle, wirst du vermutlich diese "magische Sache" niemals verstehen, obwohl sie im Grunde eigentlich ganz einfach ist.