Apache Rewrite Unterverzeichnis verstecken
Sympathisant
- webserver
0 Sympathisant0 Beat0 Sympathisant0 Beat0 Sympathisant0 Sympathisant0 Sympathisant0 Beat
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
Hai,
ach so, vergessen zu sagen, ich moechte das ganze in einer .htaccess-Datei unterbringen.
MfG,
Sympatisant
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
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
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
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
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
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
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
Hai Beat,
ich danke dir vielmals!
Endlich funktioniert es ;)
MfG,
Sympatisant