Sympathisant: Apache Rewrite Unterverzeichnis verstecken

Hai,

ich suche jetzt schon seit einer Ewigkeit nach einer Loesung fuer folgendes Problem.

Meine Verzeichnisstruktur ist wie folgt:

|- my project
   |- foo
   |- sources
      |- views
   |- bar

Meine Quelldateien liegen unter /sources/views. Dort ist zb auch die index.html vorhanden. Nun moechte ich, dass der Apache bei einer Anfrage automatisch in eben dieses Verzeichnis schaut, jedoch in der URL das Unterverzeichnis nicht angezeigt wird.

Richtig -> www.example.com/page.html
Falsch  -> www.example.com/sources/views/page.html

Ich weiss, dass das eigentlich eine recht simple Sache sein soll. Doch saemtliche Beispiele, die ich im Netz gefunden habe, haben mir leider nicht weiterhelfen koennen. Daher meine Frage.

Besten Dank.

MfG,
Sympatisant

--
"If the future isn't bright, at least it is colorful"
  1. Hai,

    ach so, vergessen zu sagen, ich moechte das ganze in einer .htaccess-Datei unterbringen.

    MfG,
    Sympatisant

    --
    "If the future isn't bright, at least it is colorful"
  2. Meine Verzeichnisstruktur ist wie folgt:
    |- my project
       |- foo
       |- sources
          |- views
       |- bar
    Meine Quelldateien liegen unter /sources/views. Dort ist zb auch die index.html vorhanden. Nun moechte ich, dass der Apache bei einer Anfrage automatisch in eben dieses Verzeichnis schaut, jedoch in der URL das Unterverzeichnis nicht angezeigt wird.
    Richtig -> www.example.com/page.html
    Falsch  -> www.example.com/sources/views/page.html
    Ich weiss, dass das eigentlich eine recht simple Sache sein soll. Doch saemtliche Beispiele, die ich im Netz gefunden habe, haben mir leider nicht weiterhelfen koennen. Daher meine Frage.

    eigentlich recht simpel
    Deine htaccess muss in dem Fall in root liegen

    RewriteEngine on
    RewriteRule ^(.+.html)$ //sources/views/$1 [L]

    Damit kannst du dann aber html Quellen generell nur noch aus
       www.example.com/sources/views/
    bedienen.

    mfg Beat

    --
    ><o(((°>           ><o(((°>
       <°)))o><                     ><o(((°>o
    1. Hai Beat,

      danke fuer deine Antwort, doch probiere ich

      http://localhost/project/index.html

      so bekomme ich einen 500er Fehler.

      Die Datei index.html existiert jedoch unter /sources/views.

      Woran kann das liegen?

      MfG,
      Sympatisant

      --
      "If the future isn't bright, at least it is colorful"
      1. http://localhost/project/index.html
        so bekomme ich einen 500er Fehler.
        Die Datei index.html existiert jedoch unter /sources/views.
        Woran kann das liegen?

        Das weiss die Apache Error log.
        vergewissere dich, dass in der httpd.config mod_rewrite.so nicht auskommentiert ist.

        mfg Beat

        --
        ><o(((°>           ><o(((°>
           <°)))o><                     ><o(((°>o
        1. Hai Beat,

          vergewissere dich, dass in der httpd.config mod_rewrite.so nicht auskommentiert ist.

          Danke fuer den Tip! Doch nachdem ich die Zeile aktiviert und den Apache neugestartet habe, bekomme ich jetzt statt des 500er einen 404er Error.

          Ich habe jetzt mal ein einfachstes Beispiel geschrieben.
          httest
          |- test <- hier liegt index.html
          .htaccess

          Die htaccess hat folgenden Inhalt
          RewriteEngine on
          RewriteRule ^(.+.html)$ //test/$1 [L]

          Das weiss die Apache Error log.

          Das Ergebnis:

          127.0.0.1 - - [11/Feb/2009:14:04:01 +0800] "GET /httest HTTP/1.1" 301 370
          127.0.0.1 - - [11/Feb/2009:14:04:01 +0800] "GET /httest/ HTTP/1.1" 200 727
          127.0.0.1 - - [11/Feb/2009:14:04:06 +0800] "GET /httest/test/ HTTP/1.1" 404 1254
          127.0.0.1 - - [11/Feb/2009:14:04:11 +0800] "GET /httest/index.html HTTP/1.1" 404 1118
          127.0.0.1 - - [11/Feb/2009:14:04:41 +0800] "GET /httest/test/index.html HTTP/1.1" 404 1118

          Besten Dank fuer deine Muehe.

          MfG,
          Sympatisant

          --
          "If the future isn't bright, at least it is colorful"
          1. Hai,

            er sucht anscheinend in dem falschen Verzeichnis:
            [Wed Feb 11 16:00:01 2009] [error] [client 127.0.0.1] File does not exist: C:/PROGRAMS/DEVELOPMENT/xampp/htdocs/test

            Es muesste jedoch heissen:
            C:/PROGRAMS/DEVELOPMENT/xampp/htdocs/httest/test

            Aendere ich den Wert der .htaccess auf:
            RewriteRule ^(.+.html)$ //httest/test/$1 [L]
            ---------------------------^
            ..dann bekomme ich folgendes ErrorLog:

            [Wed Feb 11 16:02:00 2009] [error] [client 127.0.0.1] Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3046): [client 127.0.0.1] r->uri = /httest/test/test/test/test/test/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test/test.html
            [Wed Feb 11 16:02:00 2009] [debug] core.c(3052): [client 127.0.0.1] redirected from r->uri = /httest/test.html

            Wobei der letzte Eintrag ja eigentlich korrekt ist (/httest/test.html) ?

            Doch warum landet er in einer Endlosschleife, wo ich ihm doch explizit sage, dass er unter /httest/test/ schauen soll?

            Gibt es vllt. eine Moelgichkeit ihm ein zweites Verzeichnis anzugeben? Das heisst, er soll schauen, ob die angegebene Datei in dem angegebenen Verzeichnis existiert. Falls sie nicht existiert, dann soll er im alternativen Verzeichnis nachschauen.

            MfG,
            Sympatisant

            --
            "If the future isn't bright, at least it is colorful"
            1. Hai,

              ich habe jetzt mal ein wenig rumgespielt..

              #RewriteRule ^(.+.html)$ test/$1 [L]
              RewriteRule ^(test.html)$ test/$1 [L]

              Ersteres funktioniert nicht.
              Letzteres funktioniert. Das heisst, dass der Part ".+" das Problem verursacht. Aber das ist doch der korrekte Platzhalter?

              MfG,
              Sympatisant

              --
              "If the future isn't bright, at least it is colorful"
              1. ich habe jetzt mal ein wenig rumgespielt..

                #RewriteRule ^(.+.html)$ test/$1 [L]
                RewriteRule ^(test.html)$ test/$1 [L]

                Ersteres funktioniert nicht.
                Letzteres funktioniert. Das heisst, dass der Part ".+" das Problem verursacht. Aber das ist doch der korrekte Platzhalter?

                Problem ist, dass . auf / matcht.
                Er wird die Regel auf jedes Unterverzeichnis anwenden.
                Das kann man unterbinden

                RewriteRule ^([^/]+.html)$ test/$1 [L]
                oder
                 RewriteRule ^([A-Za-z0-9_-]+.html)$ test/$1 [L]

                Damit werden dann natürlich anfragen in Unterverzeichnissen nicht mehr erfasst, sondern nur anfragen in den Ordner, in dem die .htaccess steht, umgeleitet.
                Um Sichere Regeln zu haben solltest du vielleicht mehrere Regeln schreiben.

                httproot
                ----a
                ----b
                     ----c
                     ----quellen

                RewriteRule ^([^/]+.html)$ //b/quellen/$1 [L]
                RewriteRule ^a/([^/]+.html)$ //b/quellen/$1 [L]
                RewriteRule ^b/([^/]+.html)$ //b/quellen/$1 [L]
                RewriteRule ^b/c/([^/]+.html)$ //b/quellen/$1 [L]

                Das kann man dann wieder zusammenfassen
                RewriteRule ^(|a/|b/|bc/)([^/]+.html)$ //b/quellen/$2 [L]

                wichtig ist, dass der Pfad //b/quellen/ nicht durch deine Regel gematcht wird, sonst bekommst du eine Endlosschleife.

                mfg Beat

                --
                ><o(((°>           ><o(((°>
                   <°)))o><                     ><o(((°>o
                1. Hai Beat,

                  ich danke dir vielmals!
                  Endlich funktioniert es ;)

                  MfG,
                  Sympatisant

                  --
                  "If the future isn't bright, at least it is colorful"