Till: basedir für mod_rewrite

Hallo in die Runde!

Also, ich habe mit modRewrite eine Regel erstellt, die einen URL-Aufruf wie www.test.de/de/self umleitet auf ./index.php und "de" sowie "self" als Parameter übergibt. So weit, so gut.

Nur stört sich mein Skript an der im Browser eingegebenen Ordnerhirachie ... D.h. der Pfad zu meinem Ordner mit Bildern ist jetzt z.B. über "../" zu erreichen während ein includiertes Script ohne "../" auskommt. Gibt es eine elegante Lösung, wie ich ein zusätzliches "../" vermeiden kann?

Man könnte mit
$ebene = substr_count($_SERVER['REQUEST_URI'], '/') - substr_count($_SERVER['SCRIPT_NAME'], '/');
for ($i=0; $i<$ebene; $i++)
   $dir .= '../';
eine Variable $dir deklarieren, müßte diese dann aber bei jedem Bild einfügen, das ist nicht sehr elegant ...

Vielen Dank für Eure Einfälle!
Grüße, Till

  1. Hello Till,

    ein ähnliches Problem hatte ich mir neulich gebaut.

    Da hatte ich vergessen, die RewriteBase anzugeben.
    http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritebase

    Leider konnte ich nicht mehr ausprobieren, ob nach ordnungsgemäßer Angabe das Problem beseitigt war. Das betroffene System hat immer noch Kernel Panic :-((

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hallo Tom,

      danke für Deine Antwort.

      Da hatte ich vergessen, die RewriteBase anzugeben.

      Hmm, die RewriteBase habe ich angegeben ... und die funktioniert für von PHP benutzte Pfade auch.

      Meine .htaccess:
      RewriteEngine on
      RewriteBase /WebPackPro/www/www.xyzprojekt
      RewriteRule ^([a-zA-Z0-9-_]*)/([a-zA-Z0-9-_]*).(html|php|htm|xhtml)$ index.php?id=$2&lang=$1&end=$3

      (In der httpd.conf ist denifiert: "Alias /WebPackPro D:/html/WebPackPro/")

      Was in der index.php funktioniert ist
      "include('application/inc/seitenaufbau.inc.php');"
      aber nicht
      "<img class="image_reiter" src="public/nav/titel_reiter_1.jpg" height="79" width="595" alt="Reiter" />"

      Viele Grüße,
      Till

  2. Moin!

    Also, ich habe mit modRewrite eine Regel erstellt, die einen URL-Aufruf wie www.test.de/de/self umleitet auf ./index.php und "de" sowie "self" als Parameter übergibt. So weit, so gut.

    Nur stört sich mein Skript an der im Browser eingegebenen Ordnerhirachie ... D.h. der Pfad zu meinem Ordner mit Bildern ist jetzt z.B. über "../" zu erreichen während ein includiertes Script ohne "../" auskommt. Gibt es eine elegante Lösung, wie ich ein zusätzliches "../" vermeiden kann?

    Deine Beobachtung ist logisch. Die Verzeichnisnamen deines Skriptes basieren rein auf der Struktur auf der Festplatte, während für das Laden der Bilder zuerst einmal der Browser zuständig ist, und in dieser Struktur wirkt ja deine RewriteRule. Du hast in der URL plötzlich zusätzliche "Ordner", die bei relativer Adressierung erst einmal mit "../" überwunden werden müssen.

    Viel einfacher wäre es, wenn deine Bilder mit einem beginnenden Slash eingebunden würden: "/bildordner/bild.jpg". Diese URL geht immer vom obersten Ordner im Server aus.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hallo Sven,

      Viel einfacher wäre es, wenn deine Bilder mit einem beginnenden Slash eingebunden würden: "/bildordner/bild.jpg". Diese URL geht immer vom obersten Ordner im Server aus.

      Ah! Das klingt nach einer guten Idee! Allerdings muss ich dann in diesem Fall "/WebPackPro/www/www.xyzprojekt/" vorschreiben (s. meine Antwort zum anderen Thread). Das ist natürlich nicht so schön, weil auf dem Server der Pfad natürlich wieder eine anderer ist ... Na, wenn's nicht anders geht muss ich wohl das Alias entsprechend anpassen.

      Vielen Dank!

      Grüße in den Kosmos,
      Till

      1. Moin!

        Viel einfacher wäre es, wenn deine Bilder mit einem beginnenden Slash eingebunden würden: "/bildordner/bild.jpg". Diese URL geht immer vom obersten Ordner im Server aus.

        Ah! Das klingt nach einer guten Idee! Allerdings muss ich dann in diesem Fall "/WebPackPro/www/www.xyzprojekt/" vorschreiben (s. meine Antwort zum anderen Thread).

        Nur, wenn das Bestandteil der URL-Struktur ist. Wenn das nur die Ordnerstruktur auf der Serverfestplatte ist, dann gehört das nicht in die URL, sondern (sofern es pro Website/Server veränderlich ist, und NICHT  mit $_SERVER['DOCUMENT_ROOT'] übereinstimmt) in eine entsprechende Konfigurationsdatei. Mögliche Orte wären: Zentrale PHP-Datei, die den Ordner als Konstante (die ist automatisch global, d.h. in allen Funktionen/Klassen erreichbar) definiert. Oder in der .htaccess als Environment-Variable, dann steht sie in PHP z.B. in $_ENV zur Verfügung.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Hallo Sven,

          Nur, wenn das Bestandteil der URL-Struktur ist. Wenn das nur die Ordnerstruktur auf der Serverfestplatte ist, dann gehört das nicht in die URL, sondern (sofern es pro Website/Server veränderlich ist, und NICHT  mit $_SERVER['DOCUMENT_ROOT'] übereinstimmt) in eine entsprechende Konfigurationsdatei. Mögliche Orte wären: Zentrale PHP-Datei, die den Ordner als Konstante (die ist automatisch global, d.h. in allen Funktionen/Klassen erreichbar) definiert. Oder in der .htaccess als Environment-Variable, dann steht sie in PHP z.B. in $_ENV zur Verfügung.

          Wie ich Dich verstehe, definiere ich mir eine Konstante ähnlich wie die ursprünglich von mir angedachte $dir nur eben mit entsprechenden Inhalt. Dann habe ich aber wieder das Problem, dass ich bei einem Bild im src-Attribut mit PHP "herummachen" muss. Das ist nicht elegant, wenn die Seiten z.B. mit einem CMS/Editor erzeugt werden ...

          Noch mal, um die Situation klar zu machen: Ich arbeite derzeit unter meiner lokalen Testumgebung, dort ist das Base-Dir "/WebPackPro/www/www.xyzprojekt". Auf dem eigentlichen Server, der online ist, sollte das Base-Dir dann natürlich "/" sein. Das Problem besteht also hauptsächlich in der Testumgebung, nur würde ich dort auch gerne Bilder sehen können ;)

          Vielleicht ließt dies ja noch jemand ...

          Danke & Grüße,
          Till

          1. Moin!

            Noch mal, um die Situation klar zu machen: Ich arbeite derzeit unter meiner lokalen Testumgebung, dort ist das Base-Dir "/WebPackPro/www/www.xyzprojekt".

            Was meinst du nun konkret mit "Base-Dir"?

            Auf dem eigentlichen Server, der online ist, sollte das Base-Dir dann natürlich "/" sein. Das Problem besteht also hauptsächlich in der Testumgebung, nur würde ich dort auch gerne Bilder sehen können ;)

            Es ist immer eine sehr gute Idee, Test- und Livesystem identisch aufzubauen - wobei man sich einfacherweise das Testsystem so anpaßt, dass es sich ähnlich zum Livesystem verhält, weil man auf das Livesystem oft nicht so weitgehende Einflußmöglichkeiten hat.

            Deinen Verzeichnisunterschied kann ich daher nicht wirklich nachvollziehen, denn es ist doch sehr unwahrscheinlich, dass dein Live-Webserver "/" als DOCUMENT_ROOT konfiguriert hat.

            Oder wie ist das zu verstehen?

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hallo Sven,

              danke für Deine erneute Antwort.

              Es ist immer eine sehr gute Idee, Test- und Livesystem identisch aufzubauen - wobei man sich einfacherweise das Testsystem so anpaßt, dass es sich ähnlich zum Livesystem verhält, weil man auf das Livesystem oft nicht so weitgehende Einflußmöglichkeiten hat.

              Wo Du Recht hast ... ;)

              Was meinst du nun konkret mit "Base-Dir"?

              Deinen Verzeichnisunterschied kann ich daher nicht wirklich nachvollziehen, denn es ist doch sehr unwahrscheinlich, dass dein Live-Webserver "/" als DOCUMENT_ROOT konfiguriert hat.

              Oder wie ist das zu verstehen?

              Hm, ich hatte leichtfertig angenommen, das DOCUMENT_ROOT/"Base-Dir" würde sich auf "was in der Browserzeile hinter dem Server bzw. der Domain steht" beziehen - da lag ich wohl daneben. Da werde ich heute Abend noch mal in mich gehen und etwas herumprobieren ... Momentan habe ich leider keinen Zugriff auf den Server.

              Viele Grüße,
              Till

              1. Moin!

                Hm, ich hatte leichtfertig angenommen, das DOCUMENT_ROOT/"Base-Dir" würde sich auf "was in der Browserzeile hinter dem Server bzw. der Domain steht" beziehen - da lag ich wohl daneben. Da werde ich heute Abend noch mal in mich gehen und etwas herumprobieren ... Momentan habe ich leider keinen Zugriff auf den Server.

                Nein, eher "andersherum": DOCUMENT_ROOT ist das Verzeichnis, das im DATEISystem des Servers liegt, innerhalb dessen sich alles abspielt, was "hinter der Domain" in der URL steht.

                Und "base-dir" steht überhaupt in keinem Zusammenhang damit, das ist ein Stück, welches als "RewriteBase" wieder eine ganz andere Aufgabe hat.

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Hallo,

                  Nein, eher "andersherum": DOCUMENT_ROOT ist das Verzeichnis, das im DATEISystem des Servers liegt, innerhalb dessen sich alles abspielt, was "hinter der Domain" in der URL steht.

                  So ... ich habe jetzt mal etwas aufgeräumt und mir mehr Klarheit über die Begriffe verschafft. Soweit ganz gut. Kurzer Zwischenstand:

                  LOKAL:
                  Document_Root: C/:Programme/.../htdocs/ (ist ein Windows-Rechner ...)
                  Alias in der config: /www.xyzprojekt D:/.../www.xyzprojekt/ (dort liegen die Daten)

                  SERVER:
                  Dokument_Root: /is/htdocs/.../www/
                  Dort sind die Daten in [doc_root]/www.xyzprojekt/

                  Ich kann nun also bequem als RewriteBase "/www.xyzprojekt/" angeben sowie auf ein Stylesheet verlinken mit src="/www.xyzprojekt/public/css/xyz.css" - das klappt jetzt sowohl lokal als auch online. Bis dahin schon mal DANKE.

                  Bleibt aber das Ausgangsproblem bestehen, oder sehe ich das falsch?!? Wenn ich nun ein Bild einbinden möchte, würde ich das gerne tun mit src="public/bild/bild.jpg" und nicht mit src="/www.xyzprojekt/public/bild/bild.jpg". Problematisch war das ja wegen der Rewrite-Regel ... Führt da ein Weg dran vorbei, ohne jedes mal eine PHP-Anweisung zu schreiben (src="<?php echo $var; ?>)?

                  Vielen Dank & Grüße,
                  Till

                  1. Moin!

                    Bleibt aber das Ausgangsproblem bestehen, oder sehe ich das falsch?!? Wenn ich nun ein Bild einbinden möchte, würde ich das gerne tun mit src="public/bild/bild.jpg" und nicht mit src="/www.xyzprojekt/public/bild/bild.jpg".

                    Daran führt kein Weg vorbei. Außer du eliminierst dieses blödsinnige Verzeichnis "www.xyzprojekt".

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. Hallo,

                      Daran führt kein Weg vorbei.

                      Das ist eine klare Ansage ;)

                      Außer du eliminierst dieses blödsinnige Verzeichnis "www.xyzprojekt".

                      Tja, nur ist es leider so, dass ich sowohl auf meinem lokalen Rechner als auch auf dem Server *mehrere* Projekte laufen habe ... (Die liegen schön geordnet als "www.projekt1", "www.projekt2", etc. lokal in dem per Alias eingebundenen Verzeichnis auf meiner Daten-Festplatte und auf dem Server eben im Doc-Root.)

                      D.h. wenn ich die Seite erst mal einer Domain zugeordnet habe, sollte das Problem online so wahrscheinlich nicht mehr auftreten, richtig (dann lasse ich natürlich den Ordner weg!)? Nur, dass sich dann Test- und Live-Umgebung wieder voneinander unterscheiden würden ... Ein Teufelskreis, ich merke schon!

                      Viele Grüße,
                      Till

                      ps: Ich muss dem von mir verwendeten Editor TinyMCE dann eh noch beibringen, den "/" richtig zu setzen - aber das ist eine andere Baustelle.

                      1. Moin!

                        Außer du eliminierst dieses blödsinnige Verzeichnis "www.xyzprojekt".

                        Tja, nur ist es leider so, dass ich sowohl auf meinem lokalen Rechner als auch auf dem Server *mehrere* Projekte laufen habe ... (Die liegen schön geordnet als "www.projekt1", "www.projekt2", etc. lokal in dem per Alias eingebundenen Verzeichnis auf meiner Daten-Festplatte und auf dem Server eben im Doc-Root.)

                        So ein "Projekt" ist doch wahrscheinlich eine abgeschlossene Domain. Lagert also in einem separaten virtuellen Host des Webservers. Dann hat auch jedes Projekt sein eigenes DOCUMENT_ROOT.

                        Und das realisiert man im Testsystem eben genauso: Pro Livedomain gibts eine Testdomain (die man entweder nett im lokalen Intranet-DNS definiert, oder auf jedem Rechner in der hosts-Datei - wenn die Live-Domain www.example.com heißt, sollte die Testdomain www.example.test heißen, da .test offiziell die TLD für Testzwecke ist). Jede Testdomain hat ihr eigenes DOCUMENT_ROOT. Und schon taucht nirgendwo IN DER URL mehr dieses Projektverzeichnis auf. Nur noch in der Verzeichnisstruktur des Dateisystems (was die URLs aber nicht stört).

                        Diese Einbindung als Alias halte ich hingegen für sehr hinderlich.

                        - Sven Rautenberg

                        --
                        "Love your nation - respect the others."
                        1. Hallo,

                          So ein "Projekt" ist doch wahrscheinlich eine abgeschlossene Domain. Lagert also in einem separaten virtuellen Host des Webservers. Dann hat auch jedes Projekt sein eigenes DOCUMENT_ROOT.

                          Nun ... prinzipiell schon. Ich habe nur einen Webspace, bei dem ich aber Domains auf einen Pfad konnektieren kann. Was der Provider dann intern genau macht - keine Ahnung ;)

                          Und das realisiert man im Testsystem eben genauso: Pro Livedomain gibts eine Testdomain (die man entweder nett im lokalen Intranet-DNS definiert, oder auf jedem Rechner in der hosts-Datei - wenn die Live-Domain www.example.com heißt, sollte die Testdomain www.example.test heißen, da .test offiziell die TLD für Testzwecke ist). Jede Testdomain hat ihr eigenes DOCUMENT_ROOT. Und schon taucht nirgendwo IN DER URL mehr dieses Projektverzeichnis auf. Nur noch in der Verzeichnisstruktur des Dateisystems (was die URLs aber nicht stört).

                          Sehr guter Tipp! Besten Dank.

                          Hier eine Kurzanleitung, falls jemand bis hierher gelesen hat und vor dem gleichen Problem stehen sollte ...

                          1. In der Datei "host" (unter Windows-XP meist unter c:/windows/system32/drivers/etc/ zu finden) hinzufügen:

                          127.0.0.1 www.testprojekt.test

                          2. In der httpd.conf das vhost_alias_module laden sowie einen VirtualHost hinzufügen, z.B. in etwa so:

                          NameVirtualHost 127.0.0.1
                          <VirtualHost 127.0.0.1>
                           DocumentRoot "D:/.../"
                           ServerName www.testprojekt.test
                          </VirtualHost>

                          Apache neu starten und im Browser die Domain aufrufen.

                          Vielen Dank noch mal für die Hilfe!

                          Till

                          ps: Vielleicht ginge so eine Sprach-Weiche auch über eine Subdomain zu realisieren ohne den Verzeichnis-"Stress" ... Aber dann muss man bei einer neuen Sprache erst wieder eine Subdomain anlegen, das wollte ich vermeiden.