Ankündigung

Einklappen
Keine Ankündigung bisher.

Mod_Rewrite funktioniert bei vorhandener Datei nicht

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mod_Rewrite funktioniert bei vorhandener Datei nicht

    Hallo und schönen Sonntag,
    ich habe momentan ein Problem mit mod_rewrite und einer entsprechenden Umleitung:
    Code:
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.+)\/$ index.php?path=$1
    Was ich damit bezwecken möchte ist eine Art "Bildergallerie" welche als Pfad einen Ordner-änhlichen Pfad erwartet ("path"-parameter).
    Das ganze sieht also zum Beispiel so aus, dass ich ein Bild namens "Haus-1" in der Kategorie "bar", welche in der Kategorie "foo" ist habe.
    Der ganze Pfad würde also dann foo/bar/Haus-1/ lauten.
    Das Bild wird dann vom php-Script entsprechend ausgegeben.
    So das ganze funktioniert prima, solange der Dateiname NICHT mit dem Bildnamen aus dem Pfad übereinstimmt.
    Also um bei dem Beispiel zu bleiben heißt die Datei auf dem Server zum Beispiel Haus_1.jpg und wenn ich mit Haus-1 aufrufe leitet mod_rewrite korrekt um. Wenn ich jetzt aber per Haus_1 aufrufen würde, also foo/bar/Haus_1/ dann klappt es nicht mehr.
    Da ich das ganze ohne Datenbank verwalten möchte, liegen die Bilder entsprechend ihrer Pfadangabe auch in den jeweiligen Ordnern, welche so heißen wie die Kategorien.
    Daher vermute ich das der Server nicht mit der Umleitung klar kommt, da er bei foo/bar/Haus_1/ sieht, das im Verzeichnis foo/bar/ eine Datei namens Haus_1.jpg findet?
    Und falls meine Vermutung stimmt, lässt sich das irgendwie umgehen? Oder muss ich mir etwas anderes überlegen?

    Um nochmal zusammenzufassen was ich meine:
    Code:
    URL: foo/bar/Haus_1/
    interner Dateipfad: foo/bar/Haus_1.jpg


  • #2
    mit pfaden und nicht pfaden, das hab ich nicht so ganz verstanden (mach halt die condition weg); jedoch scheint es mir sinnig, drei argumente zu übergeben, bei zwei kategorie ebenen.

    analog zu http://www.php.de/server-hosting-und...parameter.html und dem genarator würde ich also:

    Code:
    RewriteEngine On
    RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /cgi-bin/shop.php?category_1=$1&category_2=$2&name=$3 [L]
    oder ähnlichem raten

    Kommentar


    • #3
      Also ich hab jetzt gerade nochmal ein wenig rumprobiert.
      Dazu habe ich erstmal meine .htaccess umgeändert in
      Code:
      RewriteEngine On
      RewriteRule ^([^/]+)/([^/]+)/$ index.php?path1=$1&path2=$2
      Wenn ich jetzt im Browser zB foo/Haus_1/ aufrufe (um die Datei Haus_1.jpg zu "öffnen", welche den Serverpfad foo/Haus_1.jpg hat) und mir anschließend mal die GET-Parameter ausgeben lasse bekomme ich folgendes:
      Code:
      Array ( [path1] => foo [path2] => Haus_1.jpg )
      Also schätze ich mal das der Server irgendwie direkt "erkennt" das es sich um eine Datei handelt, obwohl ich in der URL ja eigentlich einen "Ordner" aufrufen möchte und daher direkt streikt? Ich bräuchte nämlich eigentlich einen GET-Parameter der so aussieht:
      Code:
      Array ( [path1] => foo [path2] => Haus_1 )
      Jetzt habe ich auch versucht die .htaccess so umzuändern um quasi diesen Punkt der Dateiendung irgendwie rauszufiltern, hat aber auch nicht geklappt..
      Code:
      RewriteEngine On
      RewriteRule ^([^/]+)/([^/.]+)/$ index.php?path1=$1&path2=$2
      Das Problem tritt halt wie gesagt wirklich nur auf wenn der Dateipfad auf dem Server und der "Pfad" in der URL übereinstimmen, bis auf den Unterschied das in der URL der Dateipfad ohne Dateiendung steht.
      Ich werde noch weiter rumprobieren aber ich habe sonst keine Idee wie ich es hinbekommen kann, außer natürlich das ganze mit einer Datenbank zu machen usw..

      Kommentar


      • #4
        statt ändern bin ich auf zitieren gekommen -.-"
        bitte löschen..

        Kommentar


        • #5
          ich verstehe dein problem nicht, sorry_
          Ich bräuchte nämlich eigentlich einen GET-Parameter der so aussieht
          Code:
          Array ( [path1] => foo [path2] => Haus_1 )
          dann schreib doch als url:b /foo/Haus_1; achso haste ja.

          dann poste den rewrite log, denn aus der regel :
          Code:
          RewriteEngine On
          RewriteRule ^([^/]+)/([^/]+)/$ index.php?path1=$1&path2=$2
          ist ein ahängen von ".jpg" nicht erkennbar.

          falls du spielereien mit punkten anstellen willst, musst du diese maskieren "\."

          hab testing tools auf stackoverflow gefunden:
          http://stackoverflow.com/questions/8...e-testing-tool

          Kommentar


          • #6
            Rewrite Log wird schwer da ich das nicht auf einem eigenen Server habe und somit nicht an die config rankomme (wo ich ja ran müsste um das Logging anzuschalten).
            Das testing tool ist soweit ganz cool, allerdings scheint das tool noch bissl buggy zu sein, zumindest bekomme ich das verhalten nicht ganz nachgestellt^^ Bzw. das was laut tool funktionieren sollte, funktioniert so nicht bei mir :/
            Habe jetzt nochmal bisschen rumgespielt und dabei kam folgendes raus:
            Code:
            RewriteRule ^([^\.]*)(.*)/$ index.php?path=$1

            Aber tatsache ist nach wie vor das das Umwandeln der URL so korrekt funktioniert. Das heißt die Teile die ich brauche werden als GET-Parameter "theoretisch" richtig angehängt.
            Aber sobald ich eine URL aufrufe, wo der korrekte echte Dateiname bzw. Pfad drin steht (nur statt dateiendung ein / ) dann wird gefühlt alles außer Kraft gesetzt und die Weiterleitung bzw. das Umwandeln auf index.php?path=blabla funktioniert nicht mehr.
            Halt nach dem Schema wie ich es bissl weiter oben beschrieben habe..
            Um es aber nochmal ein wenig anschaulicher zu erklären worauf ich genau hinauswill:
            Ordnerstruktur:
            Code:
            foo
            - bar
            - - Haus_1.jpg
            - - ...
            - bar2
            - - ...
            - nochEinHaus.jpg
            Und was passieren soll wenn ich bestimmte URLs aufrufe:
            Code:
            foo/bar/Haus_1/   ---> index.php?path=foo/bar/Haus_1
            foo/nochEinHaus/       ---> index.php?path=foo/nochEinHaus
            Was aber tatsächlich passiert (glaube ich, aber sicher bin ich mir nicht weil kein Log):
            Code:
            foo/bar/Haus_1/ --> foo/bar/Haus_1.jpg
            Wenn ich jetzt allerdings einen Pfad aufrufe, unter dem keine Datei existiert, also zB foo/bar/Haus-1/ dann wird die URL richtig umgewandelt und ich kann dann mittels php "weiterarbeiten".

            Daraus schließe ich für mich, dass ich entweder penibel drauf achten muss, dass die Dateien andersnamig als die URLs lauten (was ich eigentlich ziemlich unschön finde) oder mein mod_rewrite iwie kaputt ist

            Kommentar


            • #7
              was auch immer du da machst:

              ein rewrite rule testlink:

              http://martinmelin.se/rewrite-rule-tester/

              eingegebene url:

              foo/bar/Haus_1.jpg

              rule:

              RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /cgi-bin/shop.php?category_1=$1&category_2=$2&name=$3 [L]

              ergebniss match yes(grün).
              bei deinen regex match no(rot).

              Kommentar


              • #8
                Ich habe es mit http://htaccess.madewithlove.be/ getestet und da gibt er mir bei
                Code:
                http://example.org/foo/bar/Haus_1/
                und
                Code:
                RewriteRule ^([^\.]*)(.*)/$ index.php?path=$1
                ganz korrekt
                Code:
                http://example.org/index.php?path=foo/bar/Haus_1
                aus.
                Der von dir gepostet Link macht etwas ganz komisch.. zumindest bekomme ich damit kein Ergebnis (er akzeptiert meine Eingaben nicht)

                Kommentar


                • #9
                  hm, in dem stackoverflow dinges waren vier links, haste einen genommen.

                  aber sag mal wieso nicht was einfaches(wenn schon nur ein arg):
                  Code:
                  RewriteRule ^(.*)/$ index.php?path=$1

                  Kommentar


                  • #10
                    hm ja das erfüllt den gleichen Zweck, haste Recht.

                    Allerdings habe ich damit nach wie vor das Problem das die URL und der Dateiname/-pfad nicht identisch sein dürfen, da es sonst nicht funktioniert.
                    Weiß auch nicht wie ich das Problem noch genauer beschreiben kann :/
                    Ich bin mir aber inzwischen sehr sicher das es nicht an mod_rewrite an sich liegt, sondern vielmehr daran wie der Server eine URL interpretiert oder sowas in der Richtung..?

                    Kommentar


                    • #11
                      as told:
                      RewriteCond %{REQUEST_FILENAME} !-f
                      haste gelöscht?
                      (..) wie der Server eine URL interpretiert
                      http://httpd.apache.org/docs/2.4/ima...rocess_uri.png

                      Kommentar


                      • #12
                        okay laut dem Bild funktioniert es also so wie ich es vermute..
                        und meine gesamte .htaccess sieht jetzt so aus:
                        Code:
                        DirectoryIndex index.php
                        
                        RewriteEngine on
                        RewriteBase /files/share
                        RewriteRule ^\.htaccess$ - [F]
                        RewriteRule ^(.*)/$ index.php?path=$1
                        Ich habe jetzt gerade einmal selber nochmal rumprobiert..
                        Dazu habe ich auf dem Server in das Verzeichnis files/share/foo/bar/ eine Datei namens Haus_1.jpg gelegt.
                        Wenn ich jetzt mit der URL files/share/foo/bar/Haus_1/ darauf zugreifen möchte und mir mittels
                        Code:
                        echo $_GET["path"];
                        den Parameter ausgeben lasse kommt folgendes:
                        Code:
                        redirect:/files/share/index.php
                        wenn ich jetzt hingegen die Datei auf dem Server lösche, kommt als Ausgabe das richtige
                        Code:
                        foo/bar/Haus_1
                        Eventuell wird es dann klarer wo ich das Problem sehe?

                        Kommentar

                        Lädt...
                        X