Ankündigung

Einklappen
Keine Ankündigung bisher.

Verhalten von PHP_SELF auf Win/Linux

Einklappen

Neue Werbung 2019

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

  • Verhalten von PHP_SELF auf Win/Linux

    Kurze Situationsbeschreibung:

    Ich benutze mod_rewrite, um Anfragen direkt an eine Bootstrap-Datei umzuleiten.
    Code:
    RewriteEngine On
    RewriteRule .* index.php
    Dann versuche ich mittels PHP_SELF den aktuellen Pfad rauszuziehn.
    PHP-Code:
    $dir dirname ($_SERVER['PHP_SELF']); 
    Unter Windows lief es problemlos, unter Linux plötzlich aber net mehr. Der Aufruf http://domain.tld/path/to/app/index/index lieferte mir unter Windows das erwünschte /path/to/app, aber unter Linux abweichend /path/to/app/index.

    Das is ja nu alles halb so wild, wobei ich ja ne grobe Ahnung habe, woran das liegt (Dateisystem-Unterschiede -.-), is aber auch eher egal. Wichtiger find ich, ob ich das Verhalten irgendwie kontrollieren kann, so das bei beiden System wirklich das gleiche rauskommt. Hab jetzt nen etwas umständliches Workaround
    PHP-Code:
    $dir dirname(str_ireplace($_SERVER['DOCUMENT_ROOT'],'',$_SERVER['SCRIPT_FILENAME'])); 
    gebastelt,
    was zwar seinen Dienst tut, ich bin mir aber unsicher, wie robust dies ist.

    Ich nehm auch gerne völlig andere Vorschläge entgegen Inwiefern ist es eigentlich begründet, dass die beiden System mit der Funktion inkonsistent umgehen? Im deutschen Manual dazu jetzt nichts gefunden, werd mal das englische konsultieren.
    Nicht jeder Fehler ist ein Bug.

  • #2
    Hallo KingCrunch,

    gehe ich richtig in der Annahme, dass du damit "schöne" URLs realisieren möchtest? Falls ja, kannst du alles das, was hinter der Domain an der URL "klebt" per

    PHP-Code:
    <?php
       $_SERVER
    ['REQUEST_URI'];
    ?>
    auslesen. Möchtest du nur den Pfad haben (bei dir war das /path/to/app/index/index), so kannst du das per

    PHP-Code:
    <?php
       
    echo '<pre>'.print_r(parse_url($SERVER['REQUEST_URI'],true).'</pre>';

    ?>
    ausgeben lassen. Der Rest ist dann nur noch Kosmetik.
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Hmm ... Sieht auf jeden Fall robuster aus. Wald und Bäume sag ich da ma

      So aus Interesse: Wie robust issn (/schätz ihr) meine bisherige Variante? Und wieso macht PHP_SELF bzw dirname (bzw Beides in Kombination) nicht das, was es soll?
      Nicht jeder Fehler ist ein Bug.

      Kommentar


      • #4
        Ja ein paar Unterschiede gibt es tatsächlich, aber wenn du dir die verwendeten System-Variablen anschaust, wirst du das sicher selbst lösen, einfache String-Verarbeitung :P

        Kommentar


        • #5
          Hmm ... Naja, wenn mir dir Linux-Implementation da aber /path/to/app/index zurück gibt, dann ist es formal ja nen korrekter Pfad. Wüsste so aussm Bauch raus net, wie ich da banal mit String-Geschichten eindeutig finden kann, dass es sich wirklich um den Pfad zur index.php handelt. Bzw mein Ansatz ist ja genau der Gedanke: Ich nehme einfach pauschal den kanonischen Pfad zur index.php und entferne den Teil, der zum Doc-Root führt...

          Wieso beschleicht mich bloss das Gefühl, dass PHP_SELF dafür zu uneindeutig, wenn man System-Weichen vermeiden will? -.-
          Nicht jeder Fehler ist ein Bug.

          Kommentar


          • #6
            Hallo KingCrunch,

            wenn der Pfad wirklich der System-Pfad zur index.php ist, kannst du dir die RewriteRule fast sparen...

            Für mich ist jedoch immer noch nicht ganz klar, was du bezwecken willst? Ist das einfach nur den URL-Pfad auslesen oder das aktuelle Arbeitsverzeichnis einer index.php? Ersteres habe ich bereits beschrieben, für letzteres gibt es die Funktion getcwd().
            Viele Grüße,
            Dr.E.

            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            1. Think about software design [B]before[/B] you start to write code!
            2. Discuss and review it together with [B]experts[/B]!
            3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
            4. Write [I][B]clean and reusable[/B][/I] software only!
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

            Kommentar


            • #7
              Hmm ... getcwd sieht ähnlich aus meiner Variante mit SCRIPT_FILENAME, bloss dass da scho der Dateiname selbst fehlt ^^ Also auch denkbar. Die erste Variante is ja genau das Problem ^^ Muss da ja das Ende (zB "/index/login" oder was auch immer) los werden ^^

              Die RewriteRule is für die MVC-Implementierung vom Framework, welches ich verwende (http://domain.tld/%controller%/%action%). Es ist zwar auch möglich dies weiterhin über GET-Parameter zu lösen, find ich selbst aber doof ^^ Und bitte keine weitere Diskussion übers MVC-Pattern (zumindest nicht hier, das kommt noch früh genug wieder ).
              Naja, zumindest brauch ich den Pfad ausgehend vom Doc-Root zur index.php, damit der Front-Controller öhm ... damit irgendwas machen kann ^^ Zumindest funktionierts net, wenn der Pfad falsch is Details sind ja erstmal wurscht.

              Seh auch grad...: Angeblich kann es das Framework seit 2 Versionen (oder mehr?) auch selbst ermitteln ^^ Werd das mal testen

              Aber ausgehend zur Ursprungsfrage: Es gibt keine Möglichkeit das Verhalten von PHP_SELF irgendwie so zu kontrollieren, dass es sich gleich (auf welche der Varianten auch immer) verhält?
              Nicht jeder Fehler ist ein Bug.

              Kommentar


              • #8
                Hallo KingCrunch,

                Aber ausgehend zur Ursprungsfrage: Es gibt keine Möglichkeit das Verhalten von PHP_SELF irgendwie so zu kontrollieren, dass es sich gleich (auf welche der Varianten auch immer) verhält?
                Einzige Möglichkeit, die ich sehe, ist, den C-Code von PHP zu reviewen. Ich hatte mit diesem Angaben aber noch keine Probleme. Vielleicht ist der Haken auch wo anders zu suchen...

                [quote]Die erste Variante is ja genau das Problem ^^ Muss da ja das Ende (zB "/index/login" oder was auch immer) los werden ^^ [/qoute]
                Dann hat dir aber Zergling bereits die Lösung präsentiert: str_replace(),

                Irgendwie stehe ich entweder mächtig auf dem Schlauch, oder du beschreibst dein Problem nicht wirklich gut...
                Viele Grüße,
                Dr.E.

                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                1. Think about software design [B]before[/B] you start to write code!
                2. Discuss and review it together with [B]experts[/B]!
                3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                4. Write [I][B]clean and reusable[/B][/I] software only!
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                Kommentar


                • #9
                  Zitat von dr.e
                  Irgendwie stehe ich entweder mächtig auf dem Schlauch, oder du beschreibst dein Problem nicht wirklich gut...
                  Möglich ist beides. Wir haben scheinbar eh ein kleines Kommunikations-Problem

                  Also ganz banal: Will einfach nur eine möglichst robuste und einfach Variante, um ausgehend vom Doc-Root den Pfad zur index.php ohne index.php selbst unabhängig von der Request-Uri. In dem Sinne gibt es ja schon Lösungen, aber das "robust" macht mir Kopfzerbrechen. Ich will ja net, dass ich es auf einen dritten Server kopiere und da wieder die Server-Variable ihr Ding macht und mir alles versaut

                  Zitat von dr.e
                  Dann hat dir aber Zergling bereits die Lösung präsentiert: str_replace(),
                  Hat er zwar nicht ausdrücklich, aber eine ähnliche Lösung hab ich ja scho selbst gepostet. Mochte bloss net glauben, dass das der Weisheit letzter Schluss sein mag -.-

                  PHP-Code:
                  $dir dirname(str_ireplace($_SERVER['DOCUMENT_ROOT'], ''$_SERVER['SCRIPT_FILENAME'])); 
                  Vllt noch optimierbar Aber haltet ihr das Konstrukt für sinnvoll, oder steh ich direkt vor ner Wand?
                  Nicht jeder Fehler ist ein Bug.

                  Kommentar


                  • #10
                    Hallo KingCrunch,

                    ok. Ich rezitiere: Du möchtest den Pfad zur index.php ausgehend vom DocumentRoot ohne den Dateinamen selbst und unabhängig der URL generieren. Das geht IMHO - und falls ich nicht wieder falsch liege - so:

                    PHP-Code:
                    <?php
                       
                    echo '
                    CWD: '
                    .$cwd dirname($_SERVER['SCRIPT_FILENAME']);
                       echo 
                    '
                    DOCROOT:'
                    .$docroot $_SERVER['DOCUMENT_ROOT'];
                       echo 
                    '
                    FILENAME:'
                    .$filename basename($_SERVER['PATH_TRANSLATED']);
                       echo 
                    '
                    ONLYPATH:'
                    .$pathonly str_replace($docroot,'',$cwd);
                    ?>
                    Ich hab die echo's drin gelassen, damit du das sauber testen kannst. Das Ganze ergibt bei mir lokal:

                    CWD: E:/Apache2/htdocs/www/test.de
                    DOCROOT:E:/Apache2/htdocs/www
                    FILENAME:index.php
                    ONLYPATH:/test.de
                    Viele Grüße,
                    Dr.E.

                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                    1. Think about software design [B]before[/B] you start to write code!
                    2. Discuss and review it together with [B]experts[/B]!
                    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                    4. Write [I][B]clean and reusable[/B][/I] software only!
                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                    Kommentar


                    • #11
                      Dankedanke, wobei ... $filename wird doch garnet genutzt Sieht aber sehr ähnlich dem meinigem Ergeniss aus. Das beruhigt mich Dann kann ich das ja sicher so lassen.
                      Nicht jeder Fehler ist ein Bug.

                      Kommentar

                      Lädt...
                      X