Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit mod_rewrite und if(file_exists)

Einklappen

Neue Werbung 2019

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

  • Problem mit mod_rewrite und if(file_exists)

    Ich nutze auf meinem Server eine .htaccess mit der Funktion mod_rewrite, um dynamische URLs zu nutzen.

    Code:
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([\w]+)/?([\w]+)? /index.php?variable1=$1
    Funktioniert auch soweit alles einwandfrei. Anfangs hatte ich Probleme mit eingebundenen Bildern, da ich sie ursprünglich mit <img src="http://www.php.de/images/user01_bild.jpg"> eingebunden hatte. Durch hinzufügen eines Slashes <img src="/images/user01_bild.jpg"> klappt es jetzt mit den Bildern aber einwandfrei.

    Allerdings habe ich noch ein Problem mit der Funktion file_exists. Mit dieser prüfe ich nämlich vorab, ob das anzuzeigende Bild überhaupt auf dem Server existiert:

    PHP-Code:
    if (file_exists('images/user01_bild.jpg'))
    {echo 
    '<img src="/images/user01_bild.jpg">';}
    else
    {echo 
    '<img src="/images/standard_avatar.jpg">';} 
    Bei der Funktion file_exists musste ich nun aber einen relativen Pfad zur Datei angeben, damit das ganze funktioniert. Wenn ich einen Slash davor setze, klappt es leider nicht. Daher meine Frage: gibt es eine Möglichkeit, die Funktion file_exists mit einer absoluten Pfadangabe zu nutzen?


  • #2
    Zitat von Der Kaiser Beitrag anzeigen
    Daher meine Frage: gibt es eine Möglichkeit, die Funktion file_exists mit einer absoluten Pfadangabe zu nutzen?
    Natürlich
    Zitat von nikosch
    Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

    Kommentar


    • #3
      Zitat von Der Kaiser Beitrag anzeigen
      Daher meine Frage: gibt es eine Möglichkeit, die Funktion file_exists mit einer absoluten Pfadangabe zu nutzen?
      Ja sicher, mit dem Pfad im Filesystem http://php.net/manual/de/function.file-exists.php

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Ich nutze auf meinem lokalen PC einen Apache Webserver. Die Webseite liegt dort im Ordner "htdocs". Wie müsste denn eine Pfadangabe lauten, dass das mit dem file_exists klappt? Ich kann ja nicht "c:/Apache/htdocs/images/user01_bild.jpg" als Pfad angeben, da die Webseite ja irgendwann im Internet stehen soll.

        Kommentar


        • #5
          Wenn deine Webseite auf einem Windows-Server liegt kann das theoretisch ja auch im Internet ein realer Pfad sein. Ansonsten verwende einfach keinen absoluten Pfad, wenn du nicht weißt wo die Datei liegt (liegen wird), oder wenn du aus irgendeinem Grund einen absoluten Pfad brauchst, erstelle ihn dynamisch zur Laufzeit mit [MAN]real_path[/MAN].

          Kommentar


          • #6
            PHP-Code:
            __DIR__ '/images/user01_bild.jpg' 
            ?
            Zitat von nikosch
            Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.

            Kommentar


            • #7
              Ich kann ja nicht "c:/Apache/htdocs/images/user01_bild.jpg" als Pfad angeben, da die Webseite ja irgendwann im Internet stehen soll
              Rein theoretisch schon, das betrifft ja PHP und nicht den Browser.

              Fürs Grundsatzverständnis: bei file_exists() geht es hier um das Dateisystem am Server auf das PHP zugreift und nicht um irgendwelche Web-Pfade die der Browser dann via http:// vom Apache zieht.

              Siehe auch: http://php-de.github.io/jumpto/pfade/

              LG
              Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
              PHP.de Wissenssammlung | Kein Support per PN

              Kommentar


              • #8
                Zitat von tkausl Beitrag anzeigen
                PHP-Code:
                __DIR__ '/images/user01_bild.jpg' 
                ?
                Habe es so probiert:
                PHP-Code:
                if (file_exists(__DIR__ '/images/user01_bild.jpg'))
                {<
                img src="/images/user01_bild.jpg">;}
                else
                {<
                img src="/images/standard_avatar.jpg">} 
                Klappt leider immer noch nicht.

                Zitat von hausl Beitrag anzeigen
                Rein theoretisch schon, das betrifft ja PHP und nicht den Browser.
                Das ist mir soweit klar. Nur ist die Ordnerstruktur auf meinem Webspace ja eine andere, als auf meinem lokalen PC.

                Kommentar


                • #9
                  Und deshalb macht es logischerweise keinen Sinn, den Pfad absolut zu hardcoden (als String im Code), oder?

                  Warum brauchst du denn einen absoluten Pfad?

                  (Edit: In Bezug auf tkausl und __DIR__ hast du einen Slash vergessen.)

                  Kommentar


                  • #10
                    Zitat von mermshaus Beitrag anzeigen
                    Warum brauchst du denn einen absoluten Pfad?
                    Sagen wir so: ich brauche einen Pfad, der immer gleich bleibt - unabhängig davon, in welchem "Unterordner" sich eine PHP-Seite befindet. Sonst müsste ich ja auf jeder Unterseite "../../" etc. vor dem Pfad angeben. Um das zu vermeiden würde ich daher gern den Pfad so angeben, dass es so klappt, wie bei <img src="/images/user01_bild.jpg">.

                    Zitat von mermshaus Beitrag anzeigen
                    (Edit: In Bezug auf tkausl und __DIR__ hast du einen Slash vergessen.)
                    Danke, hatte ich eben auch bemerkt. Klappt aber leider auch mit dem Slash nicht.

                    Kommentar


                    • #11
                      Zitat von Der Kaiser Beitrag anzeigen
                      ...Klappt leider immer noch nicht.
                      Heißt was? Dann lass es dir halt mal ausgeben und schau ob dort das Bild liegt und wenn nicht, dann weißt du jetzt spätestens ja wo es hakt.

                      (mit dem Slash wie mermshaus schreibt)
                      PHP-Code:
                      echo __DIR__ '/images/user01_bild.jpg'
                      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                      PHP.de Wissenssammlung | Kein Support per PN

                      Kommentar


                      • #12
                        Das mit dem __DIR__ ist schon der richtige Weg. Habe mir eben mal per echo __DIR__; den Pfad auswerfen lassen. Da liegt dann auch der Hund begraben: mein Code-Schnippsel mit der file_exists-Funktion wird mit der Funktion include(bildkontrolle.php); in die index.php inkludiert. Die Datei bildkontrolle.php liegt aber gerade nicht im selben Ordner wie die index.php, sondern liegt in einem Verzeichnis, in dem alle zu inkludierenden Dateien zentral verwaltet werden.

                        Dieser zentrale Include-Ordner ist aber eine "Sackgasse". Ich muss aus diesem Ordner erst wieder eine Ebene zurück, also ein etwa so:
                        PHP-Code:
                        if (file_exists(__DIR__ '/../htdocs/images/user01_bild.jpg')) 
                        Das klappt soweit auch. Allerdings habe ich das Problem, dass ich die Funktion file_exists nicht ausschließlich in ausgelagerten PHP-Dateien benutze, die per include() eingebunden werden, sondern teilweise auch direkt aus der index.php. Und hier ist das __DIR__ ja dann ein anderer Pfad.

                        Kommentar


                        • #13
                          Das mit dem __DIR__ scheint doch nicht ganz zielführend zu sein, da diese Funktion ja immer nur den Pfad auswirft, in dem sich die Datei befindet, die den Code-Schnippsel __DIR__ enthält. Ich könnte also auch statt
                          PHP-Code:
                          if (file_exists(__DIR__ '/../htdocs/images/user01_bild.jpg')) 
                          einfach
                          PHP-Code:
                          if (file_exists('../htdocs/images/user01_bild.jpg')) 
                          schreiben und es würde klappen. Allerdings müsste ich dann doch jedes mal den eigentlichen Pfad "von Hand" anpassen. Hat noch jemand eine Idee? Ich will einfach nur, dass ich auf jeder beliebigen Unterseite einen Pfad verweden kann, ohne mir jedes mal Gedanken darüber machen zu müssen, auf welcher Ebene (Stichwort "../../../" etc.) ich mich nun genau befinde. Gleiches gilt im Bezug auf die Frage, ob ich den Pfad direkt in einer Unterseite verwende oder ob er sich in einem Code-Schnippsel befindet, der per include() eingebunden wird.

                          Kommentar


                          • #14
                            Ich hab es gerade nicht da, aber spiel mal mit

                            PHP-Code:
                            echo "Script-Filename ".$_SERVER["SCRIPT_FILENAME"]."<br />";
                            echo 
                            "Script-Name ".$_SERVER["SCRIPT_NAME"]."<br />";
                            echo 
                            "Document-Root ".$_SERVER["DOCUMENT_ROOT"]; 
                            rum.

                            Also las dir das mal im include ausgeben, die dann von deiner index.php ausgeführt/includest werden. Ich glaube das die /eines davon den PHP-Datei des im aufgerufenen(!) Scriptes angeben, und nicht wie __FILE__ oder __DIR__ das des includierten selbst. Habe gerade keine Zeit und Lust das zu versuchen mit/in einem include und weiß es im Detail nicht auswendig, sry.
                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #15
                              Zitat von hausl Beitrag anzeigen
                              Ich hab es gerade nicht da, aber spiel mal mit

                              PHP-Code:
                              echo "Script-Filename ".$_SERVER["SCRIPT_FILENAME"]."<br />";
                              echo 
                              "Script-Name ".$_SERVER["SCRIPT_NAME"]."<br />";
                              echo 
                              "Document-Root ".$_SERVER["DOCUMENT_ROOT"]; 
                              rum.
                              Danke. Habs eben mal in die ausgelagerte PHP-Datei packt:

                              Script-Filename C:/Apache/htdocs/index.php
                              Script-Name /index.php
                              Document-Root C:/Apache/htdocs
                              Das Problem ist, dass ich so ja immer nur an das Verzeichnis rankomme, in dem auch die jeweilige Webseitendatei liegt. Was ich bräuchte, ist halt eine Möglichkeit, mit der ich eine if(file_exists))-Prüfung durchführen kann, ohne den Pfad mit "../" jeweils anpassen zu müssen.

                              Kommentar

                              Lädt...
                              X