Andreas D: umleitung mit mod_rewrite in .htaccess-Date

Hi,
mit:

RewriteEngine on
RewriteCond %{REQUEST_URI} xyz/(.*)$
RewriteRule xyz/(.*)$ /xyz.php?id=$1

leite ich alle Anfragen bezüglich des Verzeichnisse xyz an die Datei xyz.php weiter.

Wird: www.example.de/xyz/ angefordert,
dann wird also www.example.de/xyz.php ausgelieferte.

Wird noch ein weiteres "Verzeichnis" angehängt, dann wird es als Parameter mit übergeben

Aus: www.example.de/xyz/bsp
wird also: www.example.de/xyz.php?id=bsp

Das funktioniert alles auch so weit ganz gut. Nur wenn der "/" nach der URL weggelassen wird - also z.B. www.example.de/xyz statt www.example.de/xyz/ - dann kommt folgende Fehlermeldung:

"Multiple Choices
The document name you requested (/tumblelog) could not be found on this server. However, we found documents with names similar to the one you requested.

Available documents:

* /tumblelog.php (common basename)"

Was muss ich änder damit es auch ohne "/" funktioniert. Hab schon einiges im Internet gefunden und auch ausprobiert. Aber ich bekomme es einfach nicht hin. Ich kenne mich leider mit den mod_rewrite-Umleitungen nicht gut aus. Also bitte helft mir.

Vielen Dank schon mal im Voraus
Andreas

  1. Was muss ich änder damit es auch ohne "/" funktioniert. Hab schon einiges im Internet gefunden und auch ausprobiert. Aber ich bekomme es einfach nicht hin. Ich kenne mich leider mit den mod_rewrite-Umleitungen nicht gut aus. Also bitte helft mir.

    Nabend,
    es ohne "/" funktionieren zu lassen ist keine gute Idee, da dein Bezugsverzeichnis dann ein Anderes ist und deine Links nicht mehr funktionieren.
    Daher solltest du einen Zugriff ohne "/" einfach auf die Ressource mit "/" umleiten. Das Modul für die Alternativvorschläge (mod_speling wenn ich mich recht erinnere) könntest/solltest dazu abschalten.

    Gruß,
    Andreas

    1. es ohne "/" funktionieren zu lassen ist keine gute Idee, da dein Bezugsverzeichnis dann ein Anderes ist und deine Links nicht mehr funktionieren.

      Wieso ist mein Bezugsverzeichnis dann ein anderes? Versteh ich leider nicht ganz. www.example.de/xyz und www.example.de/xyz/ ist doch das selbe Verzeichnis oder sehe ich das falsch?
      Wenn die Links erstmal nicht mehr funktionieren würden wehr nicht so schlimm: Die Seite ist noch nicht offiziell online; kann ich also noch jederzeit ändern.

      Daher solltest du einen Zugriff ohne "/" einfach auf die Ressource mit "/" umleiten.

      Hört sich nach ner Guten idee an. Hab ich eben auch schon versucht umzusetzen. Aber ich schaff es einfach nicht. Wie müsste meine .htaccess-Date denn dann aussehen damit beide Umleitungen klappen?

      Das Modul für die Alternativvorschläge (mod_speling wenn ich mich recht erinnere) könntest/solltest dazu abschalten.

      Warum sollte ich es abschalten. Erscheint mir ganz sinnvoll. Ist doch praktisch wenn der User sich mal vertippt.

      1. Hi,

        es ohne "/" funktionieren zu lassen ist keine gute Idee, da dein Bezugsverzeichnis dann ein Anderes ist und deine Links nicht mehr funktionieren.
        Wieso ist mein Bezugsverzeichnis dann ein anderes? Versteh ich leider nicht ganz. www.example.de/xyz und www.example.de/xyz/ ist doch das selbe Verzeichnis oder sehe ich das falsch?

        Den Unterschied bemerkst du dann, wenn du in den HTM-Dokumenten externe Ressourcen (Bilder, Scripte, CSS) relativ eingebunden hast.

        Verweist du auf blahblubb.jpg, dann obliegt es dem Client, daraus und aus der Adresse des aktuellen HTML-Dokumentes einen vollstaendigen URL fuer die Anfrage an den Server zusammenzusetzen.

        Und bei Aufruf des Hauptdokumentes ueber http://example.net/xyz [1] oder http://example.net/xyz/ kommt dabei dann entweder http://example.net/blahblubb.jpg oder http://example.net/xyz/blahblubb.jpg heraus.

        Das kann man aber umgehen, in dem man nicht Dokument-relativ verlinkt, sondern relativ zur Domainwurzel, also mit fuehrendem Slash. Das hat aber wiederum den Nachteil, dass dann alle Links nicht mehr stimmen, sollte man das Ganze mal in eine andere Verzeichnisebene umziehen wollen - hier muss man also ueberlegen, welchen Kompromiss man eingehen will.

        Daher solltest du einen Zugriff ohne "/" einfach auf die Ressource mit "/" umleiten.

        Das sollte man sowieso, da *ein* Inhalt unter *genau* *einer* Adresse erreichbar sein sollte, und nicht unter mehreren.
        (Und http://example.net/xyz und http://example.net/xyz/ sind eben zwei verschiedene Ressourcen.)

        Hört sich nach ner Guten idee an. Hab ich eben auch schon versucht umzusetzen. Aber ich schaff es einfach nicht. Wie müsste meine .htaccess-Date denn dann aussehen damit beide Umleitungen klappen?

        Derzeit hast du den Slash zwingend erforderlich gemacht:

        RewriteRule xyz/(.*)$ /xyz.php?id=$1

        Ihn an dieser Stelle optional zu machen, waere aber ungut - weil dann nicht nur xyz/abc, sondern auch xyzabc gematcht wuerde.

        Man koennte ihn nur dann optional machen, wenn nach xyz nichts weiteres mehr kommt.
        Aber eine eigene Regel, die lediglich xyz auf xyz/ umleitet, waere m.E. das sinnvollste.

        MfG ChrisB

        [1] example.com/.net/.org sind fuer Beispiele vorgesehen, .de nicht - also verwende bitte kuenftig eine der ersteren.

        1. Vielen Dank für die ausführlichen Erklärungen.

          Aber eine eigene Regel, die lediglich xyz auf xyz/ umleitet, waere m.E. das sinnvollste.

          Jetzt Brauch ich nur noch jemanden der mir helfen kann wie das geht. Wie gesagt ich hab es schon versucht aber ich hab's nicht geschafft. Ich wehr einem potentiellen Helfer also äußerst dankbar.

          [1] example.com/.net/.org sind fuer Beispiele vorgesehen, .de nicht - also verwende bitte kuenftig eine der ersteren.

          Werde ich natürlich machen. Ich hab einfach nicht gewusst dass example.de nicht auch zu den Beispiel-Domains gehört. Aber mann lernt ja nie aus.
          Also Danke nochmal für alles.

          1. Hi,

            Aber eine eigene Regel, die lediglich xyz auf xyz/ umleitet, waere m.E. das sinnvollste.
            Jetzt Brauch ich nur noch jemanden der mir helfen kann wie das geht. Wie gesagt ich hab es schon versucht aber ich hab's nicht geschafft.

            Du willst, wenn der Request ausschliesslich xyz anfordert, nichts davor und nichtsa danach, auf xyz/ umleiten.
            Also informieren/nachlesen, wie "nichts davor und nichts danach" in einem regulaeren Ausdruck ausgedrueckt werden kann, und wie "echtes Umleiten", also ein Redirect, per RewriteRule ausgeloest werden kann.

            Ich wehr einem potentiellen Helfer also äußerst dankbar.

            Du wehrst ihn was - ab?

            MfG ChrisB

            1. Also informieren/nachlesen, wie "nichts davor und nichts danach" in einem regulaeren Ausdruck ausgedrueckt werden kann, und wie "echtes Umleiten", also ein Redirect, per RewriteRule ausgeloest werden kann.

              Hurra! Ich bas doch noch geschafft. Hab zwar eine halbe Stunde rum probiert, aber jetzt klappt's.

              Meine .htaccess-Date sieht jetzt so aus:

                
              RewriteEngine on  
              RewriteCond %{REQUEST_URI} xyz$  
              RewriteRule xyz$ /xyz/ [redirect=permanent]  
              RewriteCond %{REQUEST_URI} xyu/(.*)$  
              RewriteRule xyz/(.*)$ /xyz.php?id=$1  
              
              

              Ich hoffe ich mach alles richtig und die Umleitung ist auch eine "echte"

              Du wehrst ihn was - ab?

              Ich meine natürlich: ich wäre im dankbar. Kommt davon wenn man beschwipst nach haus kommt und meint den Forumseintrag noch schnell beantworten zu müssen.
              Also nochmal vielen Dank für die Hilfe

              1. Hallo Andreas!

                Ichh wehr einem potentiellen Helfer also äußerst dankbar
                Du wehrst ihn was - ab?
                ich wäre im dankbar.

                In _der_ Dank-Bar.

                Kommt davon wenn man beschwipst

                von einer Bar in die andere geht?

                *SCNR*

                Viele Grüße aus Frankfurt/Main,
                Patrick

                --

                _ - jenseits vom delirium - _
                [link:hatehtehpehdoppelpunktslashslashwehwehwehpunktatomicminuseggspunktcomslash]
                Nichts ist unmöglich? Doch!
                Heute schon gegökt?
          2. echo $begrüßung;

            Aber eine eigene Regel, die lediglich xyz auf xyz/ umleitet, waere m.E. das sinnvollste.
            Jetzt Brauch ich nur noch jemanden der mir helfen kann wie das geht.

            Der URL Rewriting Guide aus dem Apache-Handbuch enthält unter anderem auch zum Trailing Slash Problem eine Lösung.

            echo "$verabschiedung $name";