Norbert Kölln: Umleitung für nicht vorhandene Dateien

Moin, moin!

Ich habe nur begrenzten Platz auf einem Server und möchte einige große Dateien auf einen anderen auslagern. Um Links etc. nicht ändern zu müssen, stelle ich mir folgendes vor:

Definition einer Regel, nach der eine Datei, die nicht auf dem Server vorhanden ist, vom anderen (beo dort vorhandener, identischer Ordnerstruktur) geladen wird. Wird also
http://www.dummesbeispiel.de/ordner/unterordner/datei.html
angefordert, ist auf dem Server aber nicht vorhanden, so soll
http://www.andererserver.de/ordner/unterordner/datei.html
ausgeliefert werden (oder Fehlerdokument, wenn auch dort nicht vorhanden). Gleiches soll auch für Bilder oder andere Dateitypen gelten.

Bei der Suche nach einer Lösung bin ich natürlich auf die Möglichkeit der Verwendung einer .htaccess-Datei gestoßen. Aber leider konnte ich kein Beispiel finden, dass zur beschriebenen Problemstellung passt und habe mir auch keine Lösung zusammenreimen können.

Für Tipps wäre ich dankbar!

Viele Grüße,
Norbert

  1. Hallo,

    Bei der Suche nach einer Lösung bin ich natürlich auf die Möglichkeit der Verwendung einer .htaccess-Datei gestoßen. Aber leider konnte ich kein Beispiel finden, dass zur beschriebenen Problemstellung passt und habe mir auch keine Lösung zusammenreimen können.

    Für Tipps wäre ich dankbar!

    RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule (.*) http://www.example.com/$1 [R=301,L]

    Viele Grüße,
    Norbert

    Gruß

    jobo

    1. Hallo,

      Hallo,

      Bei der Suche nach einer Lösung bin ich natürlich auf die Möglichkeit der Verwendung einer .htaccess-Datei gestoßen. Aber leider konnte ich kein Beispiel finden, dass zur beschriebenen Problemstellung passt und habe mir auch keine Lösung zusammenreimen können.

      Für Tipps wäre ich dankbar!

      RewriteEngine On
          RewriteCond %{REQUEST_FILENAME} -s [OR]
          RewriteCond %{REQUEST_FILENAME} -l [OR]
          RewriteCond %{REQUEST_FILENAME} -d
          RewriteRule (.*) http://www.example.com/$1 [R=301,L]

      -s und -l wohl nicht, eher -f und -d (für file und directory).

      Gruß

      jobo

      1. Wobei das zur folge hat, dass man ggf. zuerst umgeleitet wird und dann erst eine 404-Meldung erhält.

        Schlauer wäre es imho serverseitig den neuen Server zu befragen, ob die Ressource existiert und dann erst umzuleiten.

        Also Requests die kein File der Directory sind auf dieses Auswertungsscript umzuleiten - das könnte dann aber auch ohne Umleitung die Ressource vom anderen Server holen und anzeigen.

        Vorteil: der Benutzer merkt garnicht, dass das zeug auf einem anderen Server liegt.

        1. Hallo,

          Schlauer wäre es imho serverseitig den neuen Server zu befragen, ob die Ressource existiert und dann erst umzuleiten.

          per file_exists() und include() oder fget()?

          Gruß

          jobo

          1. Hello,

            Schlauer wäre es imho serverseitig den neuen Server zu befragen, ob die Ressource existiert und dann erst umzuleiten.

            per file_exists() und include() oder fget()?

            Eher mit wget. Das schreibt zuverlässig alle URIs um, wenn man es ihm sagt.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
             ☻_
            /▌
            / \ Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
            1. Hallo,

              Hello,

              Schlauer wäre es imho serverseitig den neuen Server zu befragen, ob die Ressource existiert und dann erst umzuleiten.

              per file_exists() und include() oder fget()?

              Eher mit wget. Das schreibt zuverlässig alle URIs um, wenn man es ihm sagt.

              Aber wget gibts ja für PHP wohl nicht, oder? Und exec() funktioniert doch in der Regel nicht, wegen Sicherheitseinstellungen?

              Gruß

              jobo

              1. Hello,

                Schlauer wäre es imho serverseitig den neuen Server zu befragen, ob die Ressource existiert und dann erst umzuleiten.

                per file_exists() und include() oder fget()?

                Eher mit wget. Das schreibt zuverlässig alle URIs um, wenn man es ihm sagt.

                Aber wget gibts ja für PHP wohl nicht, oder? Und exec() funktioniert doch in der Regel nicht, wegen Sicherheitseinstellungen?

                Wieso willst Du PHP bemühen? Es geht doch um die Konfiguration der Rewrite-Engine, oder?
                Oder hab ich jetzt was verkehrt verstanden?

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

                --
                 ☻_
                /▌
                / \ Nur selber lernen macht schlau
                http://bergpost.annerschbarrich.de
                1. Hallo,

                  Eher mit wget. Das schreibt zuverlässig alle URIs um, wenn man es ihm sagt.
                  Aber wget gibts ja für PHP wohl nicht, oder? Und exec() funktioniert doch in der Regel nicht, wegen Sicherheitseinstellungen?
                  Wieso willst Du PHP bemühen? Es geht doch um die Konfiguration der Rewrite-Engine, oder?

                  jetzt hast du mich neugierig gemacht. Wie stellst du es an, aus der Server-Konfigurationsdatei heraus mit einer Rewrite Rule wget aufzurufen und einzubinden? Ein separates Programm?

                  Oder hab ich jetzt was verkehrt verstanden?

                  Ich bin mir nicht ganz sicher ...

                  Ciao,
                   Martin

                  --
                  Wenn Null sehr groß ausfällt, ist es manchmal fast so gut wie ein bisschen Eins.
                  Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        2. Hello,

          Also Requests die kein File der Directory sind auf dieses Auswertungsscript umzuleiten - das könnte dann aber auch ohne Umleitung die Ressource vom anderen Server holen und anzeigen.

          Das ist aber kein kleiner Akt, die enthaltenen URis alle umzuschreiben.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Also Requests die kein File der Directory sind auf dieses Auswertungsscript umzuleiten - das könnte dann aber auch ohne Umleitung die Ressource vom anderen Server holen und anzeigen.

            Das ist aber kein kleiner Akt, die enthaltenen URis alle umzuschreiben.

            Wieso?

            Das genau mit demselben Schnipsel den jobo gepostet hat. Anstatt auf example.com schreibt man es halt auf "meinlustigesautwertungsscript.php" um - aber halt ohne 301

      2. Moinsen!

        Danke für den Tipp! Es hat nicht funktioniert, mir aber eine Anregung für eine Suche im Web gegeben. Und dabei bin ich dann auf die Lösung
             RewriteEngine On
             RewriteCond %{REQUEST_FILENAME} !-f
             RewriteRule (.*) http://www.example.com/$1
        gekommen. Der entscheidende Unterschied ist wohl das Ausrufezeichen, um die Nichtexistenz einer Datei als Bedingung  festzulegen.

        Viele Grüße,
        Norbert

        1. Hallo,

          RewriteEngine On
               RewriteCond %{REQUEST_FILENAME} !-f
               RewriteRule (.*) http://www.example.com/$1
          gekommen. Der entscheidende Unterschied ist wohl das Ausrufezeichen, um die Nichtexistenz einer Datei als Bedingung  festzulegen.

          Ja natürlich. !-f muss schon sein.

          Gruß

          jobo

    2. Moin!

      Bei der Suche nach einer Lösung bin ich natürlich auf die Möglichkeit der Verwendung einer .htaccess-Datei gestoßen. Aber leider konnte ich kein Beispiel finden, dass zur beschriebenen Problemstellung passt und habe mir auch keine Lösung zusammenreimen können.

      Für Tipps wäre ich dankbar!

      RewriteEngine On
          RewriteCond %{REQUEST_FILENAME} -s [OR]
          RewriteCond %{REQUEST_FILENAME} -l [OR]
          RewriteCond %{REQUEST_FILENAME} -d
          RewriteRule (.*) http://www.example.com/$1 [R=301,L]

      Es ist sehr traurig, dass bei der Frage nach einer simplen Weiterleitung immer gleich das Monster mod_rewrite aus der Höhle geholt wird.

      Ich gehe bei dem beschriebenen Szenario davon aus, dass man sehr bewußt manche Dateien extern hostet. Insofern kann man eine vollständige Liste aller externen Dateien erstellen, und genau für diese dann eine Weiterleitung konfigurieren:

      Redirect /pfad/zur/fehlenden/datei.ext http://www.example.org/pfad/zur/existierenden/datei.ext

      Natürlich ist das Mehraufwand. Aber wenn man das komplett dynamisch angepasst für ALLE nichtexistierenden Dateien macht, erzeugt man Weiterleitungen auch für alle gerechtfertigten 404-Errors. Und das sollte ja nicht sein.

      Außerdem erzeugt man sich so eine Liste aller extern zu hostenden Dateien, die man bei mehr Platz auf dem eigentlichen Server wieder zurückholen sollte.

      Alternativ kann man sonst ja auch direkt den gesamten Webspace auf den anderen, größeren Server packen. :)

      - Sven Rautenberg

      1. Hallo,

        Moin!

        Bei der Suche nach einer Lösung bin ich natürlich auf die Möglichkeit der Verwendung einer .htaccess-Datei gestoßen. Aber leider konnte ich kein Beispiel finden, dass zur beschriebenen Problemstellung passt und habe mir auch keine Lösung zusammenreimen können.

        Für Tipps wäre ich dankbar!

        RewriteEngine On
            RewriteCond %{REQUEST_FILENAME} -s [OR]
            RewriteCond %{REQUEST_FILENAME} -l [OR]
            RewriteCond %{REQUEST_FILENAME} -d
            RewriteRule (.*) http://www.example.com/$1 [R=301,L]

        Es ist sehr traurig, dass bei der Frage nach einer simplen Weiterleitung immer gleich das Monster mod_rewrite aus der Höhle geholt wird.

        Bitte nicht traurig sein (;-). Ist doch nur eine Variante und wenn man es präziser fassen kann, wie du sagst, warum nicht bzw. ist es dann sicherlich vernünftiger so. Ich sehe es immer auch so, dass hier jeder
        die Sachen in die Runde schmeißt, die ihm bisher untergekommen sind. Da dürfte ich ja garnicht antworten, wenn ich hier nur 100%-korrekte Antworten beisteueren müsste. Sind doch auch Denkansätze und ist doch auch eine Art Diskurs, wo dann genau wie hier die Fürs und Wieders angesprochen werden.

        Zudem würde man das mod_rewrite doch auch in deinem Ansatz benutzen im Sinne von: Wenn die Datei nich vorhanden, rewrite nach extern_datei_checker.php und die erledigt dann den Rest, oder?

        Gruß

        jobo

        1. Moin!

          Zudem würde man das mod_rewrite doch auch in deinem Ansatz benutzen im Sinne von: Wenn die Datei nich vorhanden, rewrite nach extern_datei_checker.php und die erledigt dann den Rest, oder?

          Nö, wäre nicht vorgesehen. Für jede ausgelagerte Datei schreibt man explizit eine Zeile Redirect in die .htaccess-Datei.

          - Sven Rautenberg