Ankündigung

Einklappen
Keine Ankündigung bisher.

Curl und trailing slashes

Einklappen

Neue Werbung 2019

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

  • Curl und trailing slashes

    Ich experimentiere gerade mit einem PHP Web-Proxy-Script, dass ich mir vor einer Weile mal geschrieben habe. Man hat ein Formular, gibt eine URL an und diese wird via Curl aufgerufen und der inhalt geparst, verändert und ausgegeben.

    Mein Problem ist jetzt, dass das Script manchmal nicht unterscheiden kann, ob es gerade ein Verzeichnis oder ein File abruft. Bsp:

    In dem Verzeichnis http://meinedomain.com/test liegt die datei index.html

    Mit Curl kann ich diese Datei mit drei URLs abrufen:

    http://meinedomain.com/test
    http://meinedomain.com/test/
    http://meinedomain.com/test/index.html

    Das Problem dabei: Der Proxy inkludiert automatisch externe Dateien wie CSS und Bilder. Außerdem schreibt er alle Links auf die URL des Proxys um. Diese Pfade können aber nur richtig berechnet werden, wenn der Proxy weiß, in welchem Verzeichnis er sich befindet:

    http://meinedomain.com/test -> Proxy denkt "test" ist ein file und sucht die benötigten Dateien relativ zu http://meinedomain.com/
    http://meinedomain.com/test/ -> Proxy denkt "test" ist ein folder und sucht die benötigten Dateien relativ zu http://meinedomain.com/test/
    http://meinedomain.com/test/index.html -> Proxy denkt "test" ist ein folder und sucht die benötigten Dateien relativ zu http://meinedomain.com/test/

    Ich hoffe das macht mein Problem deutlich.

    Zuerst dachte ich, dass ich das Problem lösen kann indem ich einefach einen / überall da anhänge, was nicht wie ein file ausschaut, weil es keinen Punkt im Namen hat. Aber es gibt dummerweise auch Verzeichnisse die einen Punkt enthalten und auch Files, die keinen Punkt enthalten.

    Ein Gutes Beispiel dafür ist die Wikipedia:

    http://de.wikipedia.org/wiki/Katze -> Liefert die Seite aus
    http://de.wikipedia.org/wiki/Katze/ -> 404

    Liefert evtl. CURL irgendeine Antwort darauf, was man eigentlich gerade aufgerufen hat?

    VG Chris


  • #2
    Ich glaub ich hab schon eine brauchbare Lösung gefunden. Mich würde mal interessieren, ob das Webbrowser evtl. genauso machen:

    1. An jede URL wird an den Pfad-Teil immer zunächst ein / angehangen wenn dieser nicht existiert
    2. Gibt Curl dann einen 404 zurück wird der trailing slash entfernt und es gibt einen 2. Verbindungsversuch

    Mit dieser Methode wird also immer erst geprüft, ob es sich bei der URL um einen Verzeichnisaufruf handelt oder ob man ein File direkt aufruft.
    Mir ist auch schon aufgefallen, dass Webbrowser automatisch einen / anhängen, wenn es sich tatsächlich um ein Verzeichnis handelt. Bei Wikipedia zum Beispiel ist das aber nicht der Fall, obwohl die URL wie ein Verzeichnis aussieht. Das war jetzt die einzige Methode, die mir eingefallen ist um das zu prüfen.

    VG Chris

    Kommentar


    • #3
      Zitat von Geryon Beitrag anzeigen
      Ich glaub ich hab schon eine brauchbare Lösung gefunden. Mich würde mal interessieren, ob das Webbrowser evtl. genauso machen:

      1. An jede URL wird an den Pfad-Teil immer zunächst ein / angehangen wenn dieser nicht existiert
      2. Gibt Curl dann einen 404 zurück wird der trailing slash entfernt und es gibt einen 2. Verbindungsversuch
      Nein, machen sie nicht.

      Dein Problem ist, dass du versuchst relative Urls per Request-Url aufzulösen. Wenn aber der Pfad von http://www.example.com/foo ein Verzeichnis ist, bekommst du eigentlich eine Umleitung auf http://www.example.com/foo/ zurück.

      Anstatt mit der Request-Url zu arbeiten solltest du die richtige Url nach evtl erfolgter Umleitung per curl_getinfo($curl, CURLINFO_EFFECTIVE_URL) abfragen und benutzen.

      Kommentar


      • #4
        Zitat von Blar Beitrag anzeigen
        Anstatt mit der Request-Url zu arbeiten solltest du die richtige Url nach evtl erfolgter Umleitung per curl_getinfo($curl, CURLINFO_EFFECTIVE_URL) abfragen und benutzen.
        Super! Funktioniert wunderbar!

        Wenn CURLINFO_EFFECTIVE_URL hinten einen / enthält weiß ich auch gleich noch ob ich mich in einem Verzeichnis befinde oder nicht und kann dementsprechend meine relativen Pfade richtig berechnen.

        VG und danke für die Hilfe

        Kommentar

        Lädt...
        X