You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users-de@httpd.apache.org by Manfred Rebentisch <MR...@comparat.de> on 2009/02/01 06:51:51 UTC

Verzeichnisse, Pfade in der URL

Hallo 
ich finde einfach nicht die richtige Information und hoffe, dass jemand aus 
dieser Liste einen Tip für mich hat.

Mein Apache-Modul (Handler) behandelt alle html-Requests. Auch eine URL wie
http://www.domain.com/artikel/banane.html wird behandelt. Aber der Handler 
bekommt den Request nur zu sehen, wenn das Verzeichnis "artikel" unter dem 
DocumentRoot Verzeichnis auch wirklich existiert. Wie kann ich Apache davon 
überzeugen, den Request an meinen Handler zu übergeben, auch wenn das 
Verzeichnis nicht existiert?
Ich möchte kein Rewriting dafür einrichten.

Ich bin die Apache-Doku durchgegangen und fand einfach keinen Hinweis dafür.

Vielen Dank für einen Hinweis.

Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,
also nochmal vielen Dank für Deine Hilfe.
Ich wollte noch auf ein paar Dinge enigehen und Fragen stellen - aber ich habe 
grad keine Zeit. Vielleicht in ein paar Tagen?

Grüße
Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,
nochmal vielen Dank für Deine Mail.
Ich stelle noch mal ein paar Fragen zu den Details.

Am Dienstag 03 Februar 2009 13:08:31 schrieb Bob Ionescu:
> Ja, das wäre auch der Fall ohne 'ModMimeUsePathInfo on', nur dass dann
> dein Handler nicht über Addhandler zugewiesen werden würde. Zunächst
> wird in der translate_name-Phase der Request auf einen r->filename
> übersetzt, z.B. bei r->uri /verfahren/eins/zwei/drei/glossar.html in
> r->filename /var/www/cpweb09/verfahren/eins/zwei/drei/glossar.html. In
> der map_to_storage-Phase wird mit diesem r->filename dann der
> directory_walk durchgeführt. 
Ich hatte ja versucht, im Handler den ap_hook_translate_name  zu verwenden, 
während ich mit SetHandler und AddHandler herumspielte. Aber ich hatte den 
Eindruck, dass z.B. die Rückgabe von OK nicht so wirkte, wie ich mir das 
dachte. 
> Das geht dann Verzeichnisebene für 
> Verzeichnisebene vom Wurzelverzeichnis aus. Hier werden auch die
> .htaccess-Dateien gelesen. All das, was vom r->filename noch nicht
> Verzeichnis für Verzeichnis durchlaufen wurde, ist path-info. Kommt
> der directory_walk nun an einem Punkt an, wo ein Verzeichnis nicht
Der directory_walk wird im ap_hook_map_to_storage Hook gemacht?
Da weiß ich nicht recht, was ich für einen Hook-Code programmieren könnte. 
Gibt es dazu Dokumentation? Hm, 
> mehr existiert, bricht er ab. Das letzte nicht-existierende
> Verzeichnis wird dann als Datei behandelt, die natürlich auch
> tatsächlich existieren kann (hier verfahren), r->filename bleibt also
> bei /var/www/cpweb09/verfahren. Der nicht durchlaufene Rest bleibt
> path-info (/eins/zwei/drei/glossar.html).
>
> > Die r->uri [/verfahren/eins/zwei/drei/glossar.html] wird aufgesplittet in
> > , r->path_info: [/eins/zwei/drei/glossar.html], und r->filename:
> > [/var/www/cpweb09/verfahren]
> > das heißt, wenn finfo.filetype auf 0 steht, steht in filename der erste
> > nicht existierende Pfad.
>
> Genau.
>
> > Warum ist r->used_path_info immer auf 2  (AP_REQ_DEFAULT_PATH_INFO)?
>
> Das ist der Standardwert der Direktive AcceptPathinfo.
>
> > Welche sicherheitsrelevanten Auswirkungen hat das noch?
>
> Das obliegt dem content handler. Die Direktive findet vor den content
> handlern glaube ich nur bei mod_speling in der fixup-Phase
> Berücksichtigung. Anhand der Auswertung von r->used_path_info kann der
> content handler sein Verhalten abweichend von seinem sonstigen
> Standardverhalten festlegen. Nehmen wir bspw. den core content
> handler. Dieser weist den request mit einem 404 standardmäßig ab, wenn
> path-info vorhanden ist. Hat r->used_path_info den Wert
> AP_REQ_ACCEPT_PATH_INFO (war das 0?), dann würde der core content
> handler den Request nicht abweisen. Umgekehrt bei mod_php oder
> mod_cgi: Diese Handler akzeptieren standardmäßig path-info. Steht
> r->used_path_info auf AP_REQ_REJECT_PATH_INFO, so geben sie einen 404
> zurück. Es obliegt also immer dem content handler, zu entscheiden, was
> passieren soll. Wertet der content handler r->used_path_info nicht
> aus, dann fährt er eben immer sein "fest gecodetes" Standardverhalten;
> da kann der Benutzer dann noch so viel an AcceptPathinfo
> konfigurieren, wie er will.
>
> Sollten noch statische Dateien über den core-Handler ausgeliefert
> werden, sollte AcceptPathinfo nicht verändert werden. Da dein Handler
> nicht dateisystembasiert arbeitet (du wertest r->uri aus?), sollte
> diesem path-info egal sein.
>
> Bob
>
> --------------------------------------------------------------------------
>                 Apache HTTP Server Mailing List "users-de"
>       unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
>            sonstige Anfragen an users-de-help@httpd.apache.org
> --------------------------------------------------------------------------



-- 
COMPARAT Software-Entwicklungs-GmbH
Prießstraße 16
23558 Lübeck
Telefon: 0451/479 56 60
Fax: 0451/479 56 62
Web: www.comparat.de + www.bkupserver.de
Geschf: Manfred Rebentisch
AG Lübeck, HRB 3559
-- 
COMPARAT Software-Entwicklungs-GmbH
Prießstraße 16
23558 Lübeck
Telefon: 0451/479 56 60
Fax: 0451/479 56 62
Web: www.comparat.de + www.bkupserver.de
Geschf: Manfred Rebentisch
AG Lübeck, HRB 3559
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Notiz: Wenn Sie mir das erste Mal eine E-Mail senden, kann es 
passieren, dass Sie Ihre Mail als nicht zustellbar zurückerhalten. 
Dies kommt durch einen radikalen SPAM-Schutz beim E-Mail-Provider 
und durch eine falsche Konfiguration von Mail-Systemen zwischen 
Ihnen und meinem Provider.
Senden Sie die Mail einfach nocheinmal, denn das System nimmt die Mail
immer erst ab dem zweiten Mal an.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- 
COMPARAT Software-Entwicklungs-GmbH
Prießstraße 16
23558 Lübeck
Telefon: 0451/479 56 60
Fax: 0451/479 56 62
Web: www.comparat.de + www.bkupserver.de
Geschf: Manfred Rebentisch
AG Lübeck, HRB 3559

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Bob Ionescu <bo...@googlemail.com>.
Hallo Manfred.
Am 3. Februar 2009 07:04 schrieb Manfred Rebentisch <MR...@comparat.de>:
> Bei der URI
>        r->uri: [/gruenkohl/gruenkohl.html]
> gibt es ein PATH_INFO:
>        r->path_info: [/gruenkohl.html]
>
>        r->finfo.protection: 1877 (0x755),
>        r->used_path_info: 2  (AP_REQ_DEFAULT_PATH_INFO)
>        r->finfo.filetype: 0 (no filetype determined)
>
> Wenn ich eine URI verwende, wo der Pfad existiert, aber die Datei nicht, sind
> die Werte die gleichen, aber path_info ist leer und
>        r->finfo.filetype: 0 (no filetype determined)
>
> Wenn auch die Datei im Filesystem existiert, hat finfo.protection den Wert:
>        r->finfo.protection: 1604 (0x644)
> und
>        r->finfo.filetype: 1 (regular file)
>
> Ich kann also zusammenfassen und bei gesetzter Einstellung
> mit "ModMimeUsePathInfo on" r->finfo.filetype auf 0 prüfen und path_info auf
> nicht leer: dann habe ich ein Verzeichnis, das nicht existiert.

Ja, das wäre auch der Fall ohne 'ModMimeUsePathInfo on', nur dass dann
dein Handler nicht über Addhandler zugewiesen werden würde. Zunächst
wird in der translate_name-Phase der Request auf einen r->filename
übersetzt, z.B. bei r->uri /verfahren/eins/zwei/drei/glossar.html in
r->filename /var/www/cpweb09/verfahren/eins/zwei/drei/glossar.html. In
der map_to_storage-Phase wird mit diesem r->filename dann der
directory_walk durchgeführt. Das geht dann Verzeichnisebene für
Verzeichnisebene vom Wurzelverzeichnis aus. Hier werden auch die
.htaccess-Dateien gelesen. All das, was vom r->filename noch nicht
Verzeichnis für Verzeichnis durchlaufen wurde, ist path-info. Kommt
der directory_walk nun an einem Punkt an, wo ein Verzeichnis nicht
mehr existiert, bricht er ab. Das letzte nicht-existierende
Verzeichnis wird dann als Datei behandelt, die natürlich auch
tatsächlich existieren kann (hier verfahren), r->filename bleibt also
bei /var/www/cpweb09/verfahren. Der nicht durchlaufene Rest bleibt
path-info (/eins/zwei/drei/glossar.html).

> Die r->uri [/verfahren/eins/zwei/drei/glossar.html] wird aufgesplittet in ,
> r->path_info: [/eins/zwei/drei/glossar.html], und r->filename:
> [/var/www/cpweb09/verfahren]
> das heißt, wenn finfo.filetype auf 0 steht, steht in filename der erste nicht
> existierende Pfad.

Genau.

> Warum ist r->used_path_info immer auf 2  (AP_REQ_DEFAULT_PATH_INFO)?

Das ist der Standardwert der Direktive AcceptPathinfo.

> Welche sicherheitsrelevanten Auswirkungen hat das noch?

Das obliegt dem content handler. Die Direktive findet vor den content
handlern glaube ich nur bei mod_speling in der fixup-Phase
Berücksichtigung. Anhand der Auswertung von r->used_path_info kann der
content handler sein Verhalten abweichend von seinem sonstigen
Standardverhalten festlegen. Nehmen wir bspw. den core content
handler. Dieser weist den request mit einem 404 standardmäßig ab, wenn
path-info vorhanden ist. Hat r->used_path_info den Wert
AP_REQ_ACCEPT_PATH_INFO (war das 0?), dann würde der core content
handler den Request nicht abweisen. Umgekehrt bei mod_php oder
mod_cgi: Diese Handler akzeptieren standardmäßig path-info. Steht
r->used_path_info auf AP_REQ_REJECT_PATH_INFO, so geben sie einen 404
zurück. Es obliegt also immer dem content handler, zu entscheiden, was
passieren soll. Wertet der content handler r->used_path_info nicht
aus, dann fährt er eben immer sein "fest gecodetes" Standardverhalten;
da kann der Benutzer dann noch so viel an AcceptPathinfo
konfigurieren, wie er will.

Sollten noch statische Dateien über den core-Handler ausgeliefert
werden, sollte AcceptPathinfo nicht verändert werden. Da dein Handler
nicht dateisystembasiert arbeitet (du wertest r->uri aus?), sollte
diesem path-info egal sein.

Bob

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Emil Obermayr <no...@nobswolf.info>.
Noch eine Idee für "gemischten" Betrieb an existierenden und nicht
existierenden Verzeichnissen ist natürlich noch Errordocument 404
zu benutzen.

Nur so eine Idee.

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,

Am Montag 02 Februar 2009 23:06:26 schrieb Bob Ionescu:
>
> > 3) Mich mit mod_rewrite beschäftigen, falls das überhaupt Sinn macht.
>
> Zum setzen des Handlers, ja, Rewriting selbst, nein - es gibt ja
> nichts zum Umschreiben auf eine andere Ressource.
Ja, das schaue ich mir auch nochmal an.

>
> Also ist dein Problem nur, dass beim Vorhandensein von path-info dein
> über AddHandler zugewiesener Handler nicht gesetzt wird und der
> core-Handler läuft? Hast du denn mal
>    ModMimeUsePathInfo on
> probiert?

Ja, hatte ich. Und heute morgen nochmal und damit komme ich jetzt klar.
Bei der URI
	r->uri: [/gruenkohl/gruenkohl.html]
gibt es ein PATH_INFO:
	r->path_info: [/gruenkohl.html]

	r->finfo.protection: 1877 (0x755), 
	r->used_path_info: 2  (AP_REQ_DEFAULT_PATH_INFO)
	r->finfo.filetype: 0 (no filetype determined)

Wenn ich eine URI verwende, wo der Pfad existiert, aber die Datei nicht, sind 
die Werte die gleichen, aber path_info ist leer und 
	r->finfo.filetype: 0 (no filetype determined)

Wenn auch die Datei im Filesystem existiert, hat finfo.protection den Wert:
	r->finfo.protection: 1604 (0x644)
und
	r->finfo.filetype: 1 (regular file)

Ich kann also zusammenfassen und bei gesetzter Einstellung 
mit "ModMimeUsePathInfo on" r->finfo.filetype auf 0 prüfen und path_info auf 
nicht leer: dann habe ich ein Verzeichnis, das nicht existiert. 

Die r->uri [/verfahren/eins/zwei/drei/glossar.html] wird aufgesplittet in , 
r->path_info: [/eins/zwei/drei/glossar.html], und r->filename: 
[/var/www/cpweb09/verfahren]
das heißt, wenn finfo.filetype auf 0 steht, steht in filename der erste nicht 
existierende Pfad.

Warum ist r->used_path_info immer auf 2  (AP_REQ_DEFAULT_PATH_INFO)?
Welche sicherheitsrelevanten Auswirkungen hat das noch?

>
> > Ich könnte es ja auch noch ganz anders machen: mit AddHandler noch eine
> > Dateiendung "htx" erfinden und die Pfad-Parameter in
> > Pseudo-Dateinamenteile umwandeln (das Verzeichnis gemuese kann ich ja
> > noch leicht anlegen):
> > http://www.domain.com/gemuese/gruenkohl-geschichte.htx
> > oder
> > http://www.domain.com/glossar/mein-suchbegriff.htx
>
> Dann würde es durch das angelegte Verzeichnis und dem Fehlen weiterer
> Verzeichnis-Segmente kein path-info geben, ja.

Ja, diese Möglichkeit habe ich (zusätzlich) immer noch.

Vielen Dank für Deine Hilfe.
Manfred


--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Bob Ionescu <bo...@googlemail.com>.
Am 2. Februar 2009 22:28 schrieb Manfred Rebentisch <MR...@comparat.de>:
> Ich weiß also immer noch nicht nicht, wie ich das nun am besten mache:
> 1) Verzeichnisse "einfach" im System anlegen
> 2) Mich mit der SetHandler-Variante (tagelang) beschäftigen

Wenn noch etwas anderes serviert werden soll (xyz.txt aus dem
Dateisystem), dann fällt das sowieso weg.

> 3) Mich mit mod_rewrite beschäftigen, falls das überhaupt Sinn macht.

Zum setzen des Handlers, ja, Rewriting selbst, nein - es gibt ja
nichts zum Umschreiben auf eine andere Ressource.

Also ist dein Problem nur, dass beim Vorhandensein von path-info dein
über AddHandler zugewiesener Handler nicht gesetzt wird und der
core-Handler läuft? Hast du denn mal
   ModMimeUsePathInfo on
probiert?

> Ich könnte es ja auch noch ganz anders machen: mit AddHandler noch eine
> Dateiendung "htx" erfinden und die Pfad-Parameter in Pseudo-Dateinamenteile
> umwandeln (das Verzeichnis gemuese kann ich ja noch leicht anlegen):
> http://www.domain.com/gemuese/gruenkohl-geschichte.htx
> oder
> http://www.domain.com/glossar/mein-suchbegriff.htx

Dann würde es durch das angelegte Verzeichnis und dem Fehlen weiterer
Verzeichnis-Segmente kein path-info geben, ja.

Bob

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,
vielen Dank für Deine ausführlichen Antworten!
Im Moment raucht mir der Kopf, weil ich so viele Varianten ausprobiert habe. 
Ich fasse nochmal zusammen, damit die Mühe, die Du Dir machst, nicht umsonst 
ist.
A) Ich will Pseudo-Path-Parameter verwenden, weil die Anwender meines Moduls 
keine GET-Parameter in der URL sehen wollen (wegen Suchmaschinen).
Außerdem erlauben die Pfad-Parameter wie "gruenkohl" eine schönere Ordnung. 
Bei dutzenden von Gemüsesorten will ich aber nicht alle als Verzeichnisse 
anlegen.
B) Mein Modul ist ein Apache-Handler. Dieser wird mit AddHandler gesetzt und 
behandelt explizit die Dateien, die dort angegeben werden (meist html, oft 
css, aber bei Bedarf auch Bilder und JavaScript).
C) SetHandler soll nach Möglichkeit nicht benutzt werden, weil ich dann viele 
Varianten berücksichtigen muß, die Apache sonst übernimmt (z.B. .htaccess). 
SetHandler könnte aber die vernünftigste Zukunftsoption sein.
D) Neue Pfade (wie "gruenkohl" einer ist) kommen im Betrieb hinzu, über das 
CMS vom Anwender. Dadurch gibt es keine statische Konfiguration.

Ich konnte feststellen, dass alle Deine Aussagen richtig sind, Du kennst Dich 
ja richtig gut aus! Aber jeder Lösungsvorschlag von Dir hat auch seine 
Schattenseiten.
Ich weiß also immer noch nicht nicht, wie ich das nun am besten mache:
1) Verzeichnisse "einfach" im System anlegen
2) Mich mit der SetHandler-Variante (tagelang) beschäftigen
3) Mich mit mod_rewrite beschäftigen, falls das überhaupt Sinn macht.

Ich könnte es ja auch noch ganz anders machen: mit AddHandler noch eine 
Dateiendung "htx" erfinden und die Pfad-Parameter in Pseudo-Dateinamenteile 
umwandeln (das Verzeichnis gemuese kann ich ja noch leicht anlegen):
http://www.domain.com/gemuese/gruenkohl-geschichte.htx
oder
http://www.domain.com/glossar/mein-suchbegriff.htx

Herzlichen Dank für Deine Mühe

Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Bob Ionescu <bo...@googlemail.com>.
Am 2. Februar 2009 18:07 schrieb Manfred Rebentisch <MR...@comparat.de>:
> Hallo Bob,
>
> ich sehe, dass Deine Hinweise für mich zu einer perfekten Lösung führen
> können. Aber da SetHandler einiges verändert, wie Du richtig anmerkst, ist
> das eine aufwendigere Programmierung. Ich möchte dazu noch in den
> Apache-Sourcen schauen, welche Funktionen ich heranziehen kann, damit ich
> nicht alles selber machen muß.

Was soll denn alles nicht von deinem Handler behandelt werden? mod_dir
scheidet mit DirectoryIndex und dem trailing slash ja sowieso schon
einmal aus, da die angeforderten Ressourcen nicht im Dateisystem
existieren und mod_dir auf deren Existenz prüft. Wenn nur
/foo/bar.html an deinen Handler durchgereicht werden soll, dann kannst
du auch AddHandler weiterverwenden. Es bleibt natürlich noch der "root
request", also '/', der von AddHandler so erst einmal nicht erfasst
werden würde (vielmehr würde mod_dir nach Index-Dokumenten suchen;
solange du keine dummy index.html platzierst, der dann wiederum dein
Handler im subrequest lookup zugewiesen werden würde, wird das ja
fruchtlos sein). Der müsste/sollte ja sicherlich auch bei deinem
Handler landen. Wenn das kein Hook deines Moduls erledigen soll, so
kann das mod_rewrite in der httpd.conf übernehmen:

RewriteEngine on
   # endet auf .html oder nur /
RewriteRule \.html$|^/$ - [H=foo-handler,L]

Der Hook von mod_rewrite, der den Handler setzt, läuft in der
Fixup-Phase am Ende (APR_HOOK_LAST), sodass AddHandler von mod_mime
(type_checker-Phase vor den Fixups) oder SetHandler vom Core (Fixup
APR_HOOK_REALLY_FIRST) überschrieben werden.

Alles, was nicht erfasst wird, würde dann mangels Zuweisung beim
core-Handler landen, der einen Fehler serviert.

> Fürs erste versuche ich, das Verfahren mit Hilfe von PATH_INFO zu ändern, also
> eine URL "www.domain.com/gemuese.html/gruenkohl/geschichte" zu verwenden.

Oder du nutzt eben die Direktive ModMimeUsePathInfo on, damit mod_mime
beim Processing von 'Addhandler foo-handler html' statt
/var/www/foo nun /var/www/foo/path/info.html berücksichtigt und in
diesem Fall den Handler zuweist.

> Das ist ganz einfach umzusetzen und damit vielleicht überhaupt besser?

Besser wäre es wohl den überflüssigen directory_walk loszuwerden (da
uns das Dateisystem ja hier egal ist - btw: Grafiken etc. serviert ein
anderer Server?) und damit path-info überhaupt nicht entstehen zu
lassen (path-info = nicht konsumierter Teil des r->filename). Für den
Normaluser ist .html mit path-info ungewohnt (da eben standardmäßig
vom core-Handler abgewiesen); solltest du auch "URL-Design" betreiben,
würde ich schon die Endung auch am Ende belassen.

> Haben die Positional-Parameter gegenüber diesen PATH_INFO einen wichtigen

Positional-Parameter?

Bob

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,

ich sehe, dass Deine Hinweise für mich zu einer perfekten Lösung führen 
können. Aber da SetHandler einiges verändert, wie Du richtig anmerkst, ist 
das eine aufwendigere Programmierung. Ich möchte dazu noch in den 
Apache-Sourcen schauen, welche Funktionen ich heranziehen kann, damit ich 
nicht alles selber machen muß.

Fürs erste versuche ich, das Verfahren mit Hilfe von PATH_INFO zu ändern, also 
eine URL "www.domain.com/gemuese.html/gruenkohl/geschichte" zu verwenden. Das 
ist ganz einfach umzusetzen und damit vielleicht überhaupt besser?
Haben die Positional-Parameter gegenüber diesen PATH_INFO einen wichtigen 
Vorteil?

Grüße
Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Bob,
erstmal vielen Dank für Deine ausführliche und kompetente Antwort!

Ich benutze kein PHP, habe den Apache 2 unter Debian Etch.

Ich werde mir jetzt mal Deinen Text vornehmen und testen und dann gebe ich 
hier wieder ein Feedback.

Grüeß
Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Bob Ionescu <bo...@googlemail.com>.
Am 1. Februar 2009 12:58 schrieb Manfred Rebentisch <MR...@comparat.de>:
> Der Apache schaut per Default nach, ob ein Verzeichnis oder eine Datei (v.a.
> DirectoryIndex) existiert.

Ja, allerdings macht er beim Feststellen ob es eine Datei oder ein
Verzeichnis ist (r->finfo.[...]), zunächst noch nichts (core
map_to_storage hook). Sollte ein Handler per SetHandler zugewiesen
sein, so wird mod_dir unter Apache 2.0 und 2.2 (anders 1.3 und derzeit
trunk) auch bei Verzeichnisaufrufen nicht nach Index-Dokumenten
suchen.

> Andernfalls erscheint im Log:
>
>  File does not exist: /var/www/gemuese/gruenkohl

Das kommt vom default_handler. Der läuft immer dann, wenn kein anderer
Handler zugewiesen wurde (werden konnte).

> (Hier ist /var/www/gemuese das DocumentRoot Verzeichnis und "gruenkohl" das
> nicht existierende Verzeichnis.

Forderst du '/gruenkohl/foo.html' an, '/var/www/gemuese/gruenkohl/'
existiert nicht als Verzeichnis, dann ist '/foo.html' path-info. Setzt
du nunmehr einen Handler über 'AddHandler foo-handler html', wird
dieser nicht zugewiesen, da path-info unberücksichtigt bleibt und das
letzte als Datei behandelte Segment 'gruenkohl' keine Dateiendung
'html' besitzt. Das ist über die Direktive 'ModMimeUsePathInfo' in
Apache 2.x konfigurierbar. Setzt du den Handler über SetHandler,
besteht dieses Problem nicht (Vers. 1.3.x könnte sich anders
verhalten, kA.).

> Ich bräuchte das DocumentRoot fast garnicht, da der Handler alle Requests
> behandeln könnte.

Warum baust du dann keinen kleinen

- translate_name-hook, welcher r->uri auf r->filename kopiert
- map_to_storage-hook, welcher den directory_ und file_walk umschifft
(also OK zurückgibt, ohne etwas zu tun; sollen kontextlose Anfragen
wie TRACE berücksichtigt werden, so müsste das hier erfolgen)

Damit hättest du das Dateisystem quasi "abgestellt", da alles nur noch
URL-path basiert läuft. <directory> und <files>-Abschnitte und
.htaccess-Dateien werden dann natürlich auch nicht mehr verarbeitet,
d.h. du müsstst auf <location> ausweichen. Alles, was
dateisystembasiert ist (DirectoryIndex, trailing slash bei
Verzeichnissen, mod_autoindex etc.) funktioniert dann natürlich auch
nicht mehr; das müsste dein Handler dann berücksichtigen, den du dann
am besten per SetHandler involvierst.

Bob

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Am Montag 02 Februar 2009 10:20:37 schrieb James Blond:
> Hallo Manfred,
>
> >> RewriteEngine on
> >> RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
> >
...
>
> Du hast das Rewriting oben nicht ganz verstanden.
> Die URL würden ja bleiben, egal ob vorhanden im Filesystem oder nicht.
Mit rewrite habe ich mich noch nie richtig befaßt. Ich weiß jetzt garnicht, 
was ich da eingeben soll.

>
> Ein schlaunes PHP script, in diesem Fall die index.php guckt, ob die
> Datei im Filesystem zu finden ist,
> und wenn nicht, dann könnte ein von Dir defenierter Inhalt ausgegeben
> werden.
>
> Reloaden müßtest Du den apache auch nicht für jedes Verzeichnis, wenn
> die rewrite rule für das DocumentRoot gesetzt ist. Du müßtest
> lediglich das Handling in der index.php anpassen.
>
> Ich habe damit schon ganz gute Erfahrungen gemacht.
Also PHP habe ich nicht. Aber das ist ja auch egal. Das ginge ja auch mit C. 
>
> Mal so gefragt, was für ein CMS nutzt Du denn?

Nunja, ich habe ein eigenes Internet-Application-Framework mit C/C++ 
aufgebaut, auf der Basis eines Apache-Moduls. Läuft sehr gut und schnell.


Grüße
Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Emil Obermayr <no...@nobswolf.info>.
Am Montag, 2. Februar 2009 schrieb Manfred Rebentisch:

> Ich glaube, ICH verstehe das nicht. Ich habe nicht genug Ahnung von
> mod_rewrite.

also noch mal von vorn:

Du möchtest alle Anfragen an den Server vom gleichen Programm bearbeitet 
haben.

Der Browser kommt also mit einer Anfrage wie 

GET /ganz/wichtige/info?betreff=foobar ...

Der Server leitet das per Alias weiter an 

/usr/local/wwwzeug/girlyforeverything.php

und das Mädchen für alles bekommt die Anfrage komplett als Parameter übergeben 
und findet dann mit irgendeiner CMS-Magie die richtigen Daten und schickt das 
als Seite zurück.

Mein Vorschlag dazu:

AcceptPathInfo On
Alias /  /usr/local/wwwzeug/girlyforeverything.php

Nun sollte das Mädchen für alles im Environment (in PHP im superglobal Array 
$_SERVER) alle Infos über die Anfrage finden, die es braucht.

Mit selbst geschriebenen Handlern kenne ich mich nicht aus, aber das müsste 
genau so gut gehen. Alias gehört übrigens zum mod_alias, nicht zu rewrite und 
AcceptPathInfo ist im Core.

Ich will die Rewrite-Idee nicht schlecht reden, aber ich bin ein Fan davon 
immer die einfachste Methode zu wählen und ich denke ein Alias ist simpler 
als eine Rewrite-Regel.

Viel Erfolg, du schaffst das schon :)

Emil

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Emil,

Am Montag 02 Februar 2009 16:42:18 schrieb Emil Obermayr:
> Am Sonntag, 1. Februar 2009 schrieb Manfred Rebentisch:
> > Vielleicht kann man das garnicht mit einer normalen Konfiguration machen,
> > was ich will. Denn wenn ich mit rewrite oder alias arbeiten würde, dann
> > müßte ich für jedes Verzeichnis den Apache reload'en. Dann könnte ich
> > einfacher die Verzeichnisse anlegen.
>
> äh, das verstehe ich nicht... was willst du reloaden?
Ich glaube, ICH verstehe das nicht. Ich habe nicht genug Ahnung von 
mod_rewrite.

>
> Mit dem angegebenen Alias kannst du jede beliebige URL an den Server
> schicken und es wird immer diese eine index.shtml aufgerufen; es
> interessiert ihn überhaupt nicht mehr, was im Filesystem steht.
>
> Das Ziel des Alias muss natürlich nichtsdestotrotz freigegeben sein; aber
> das ist ja nur ein statischer Eintrag.
>
Das habe ich, glaube ich zumindest, verstanden. Ich habe unterschiedliche 
Dateinamen. Das haut nicht hin.

Danke aber für Deine Mails!

Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Emil Obermayr <no...@nobswolf.info>.
Am Sonntag, 1. Februar 2009 schrieb Manfred Rebentisch:

> Vielleicht kann man das garnicht mit einer normalen Konfiguration machen,
> was ich will. Denn wenn ich mit rewrite oder alias arbeiten würde, dann
> müßte ich für jedes Verzeichnis den Apache reload'en. Dann könnte ich
> einfacher die Verzeichnisse anlegen.

äh, das verstehe ich nicht... was willst du reloaden?

Mit dem angegebenen Alias kannst du jede beliebige URL an den Server schicken 
und es wird immer diese eine index.shtml aufgerufen; es interessiert ihn 
überhaupt nicht mehr, was im Filesystem steht.

Das Ziel des Alias muss natürlich nichtsdestotrotz freigegeben sein; aber das 
ist ja nur ein statischer Eintrag.

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by James Blond <jb...@gmail.com>.
Hallo Manfred,

>> RewriteEngine on
>> RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
>>
>
>
> Hier kann man Anfragen umleiten, aber das meine ich nicht, das will ich so
> nicht.
> Zum Beispiel die URLs:
> http://www.domain.com/gruenkohl/geschichte.html
> http://www.domain.com/gruenkohl/garten.html
> http://www.domain.com/kuerbis/geschichte.html
> http://www.domain.com/kuerbis/garten.html

Du hast das Rewriting oben nicht ganz verstanden.
Die URL würden ja bleiben, egal ob vorhanden im Filesystem oder nicht.

Ein schlaunes PHP script, in diesem Fall die index.php guckt, ob die
Datei im Filesystem zu finden ist,
und wenn nicht, dann könnte ein von Dir defenierter Inhalt ausgegeben werden.

Reloaden müßtest Du den apache auch nicht für jedes Verzeichnis, wenn
die rewrite rule für das DocumentRoot gesetzt ist. Du müßtest
lediglich das Handling in der index.php anpassen.

Ich habe damit schon ganz gute Erfahrungen gemacht.

Mal so gefragt, was für ein CMS nutzt Du denn?

Gruß
Mario

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.
Hallo Emil und James,

Am Sonntag 01 Februar 2009 15:59:04 schrieb Emil Obermayr:
>
> Was hier funktioniert hat, ist einen Alias zu setzen:
>
> Alias / /home/www/pathtest/index.shtml/
>

Am Sonntag 01 Februar 2009 19:45:01 schrieb James Blond:
> Hallo,
> mit rewrite läßt sich da etwas machen
>
> RewriteEngine on
> RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php
>


Hier kann man Anfragen umleiten, aber das meine ich nicht, das will ich so 
nicht.
Zum Beispiel die URLs:
http://www.domain.com/gruenkohl/geschichte.html
http://www.domain.com/gruenkohl/garten.html
http://www.domain.com/kuerbis/geschichte.html
http://www.domain.com/kuerbis/garten.html

Vielleicht kann man das garnicht mit einer normalen Konfiguration machen, was 
ich will. Denn wenn ich mit rewrite oder alias arbeiten würde, dann müßte ich 
für jedes Verzeichnis den Apache reload'en. Dann könnte ich einfacher die 
Verzeichnisse anlegen.

Ich behandle die Verzeichnisse im Handler. Man kann so eine URL mit dem CMS 
anlegen, aber ich will nicht Schreibrechte im DokumentRoot setzen.

Grüße
Manfred

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by James Blond <jb...@gmail.com>.
Hallo,
mit rewrite läßt sich da etwas machen

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

Die obige Rewrite-Regel routet alle Anfragen, die nicht nach Ressourcen
(also Bilder, Stylesheets und Javascript-Dateien) fragen, zum Front-Controller.
Wenn es noch andere Dateitypen gibt, für die der Front Controller
nicht aufgerufen werden soll,
müssen deren Dateiendungen lediglich in die obige Regel eingefügt
werden - oder man schreibt
sich seine eigenen Rewrite-Regeln.

im PHP script läßt sich dann locker die angeforderte URL zerlegen :-)

Gruß
Mario

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Emil Obermayr <no...@nobswolf.info>.
Am Sonntag, 1. Februar 2009 schrieb Manfred Rebentisch:

> Wie konfiguriert man nun den Apache, damit er die Entscheidung über die 
> Existenz des Verzeichnisses dem Handler überläßt?

Hab's noch mal probiert; du hast natürlich recht. AcceptPathInfo tut nur, wenn 
es das Verzeichnis gibt. Steht auch so in der Doku.

Was hier funktioniert hat, ist einen Alias zu setzen:

Alias / /home/www/pathtest/index.shtml/

Weit bin ich damit jetzt noch nicht gekommen, weil das einzige System was ich 
gerade "kaputtspielen" darf, kann kein PHP und steh mit SSI ein bisschen auf 
Kriegsfuß.

Aber zumindest wird nun immer diese Datei aufgerufen, egal wie die URL 
ausschaut. Ob das mit beliebigem Handler funktioniert weiß ich nicht, aber 
mit PHP sollte es gehen.

Emil

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Manfred Rebentisch <MR...@comparat.de>.

Am Sonntag 01 Februar 2009 07:37:17 schrieb Emil Obermayr:
> Mit welchen Direktiven hast Du es denn schon versucht?
AcceptPathInfo

>
> Ich denke das sollte es tun:
>
> <Location />
>   SetHandler mein_handler
> </Location>
>

Hm, ich habs noch mal probiert. Aber das ist es nicht.

Der Apache schaut per Default nach, ob ein Verzeichnis oder eine Datei (v.a. 
DirectoryIndex) existiert. Wenn ja, wird der Handler aufgerufen.
Andernfalls erscheint im Log:

 File does not exist: /var/www/gemuese/gruenkohl

(Hier ist /var/www/gemuese das DocumentRoot Verzeichnis und "gruenkohl" das 
nicht existierende Verzeichnis.

Wie konfiguriert man nun den Apache, damit er die Entscheidung über die 
Existenz des Verzeichnisses dem Handler überläßt?

Ich bräuchte das DocumentRoot fast garnicht, da der Handler alle Requests 
behandeln könnte. Aber wenn das Verzeichnis existieren muß, schränkt das die 
Gestaltungsfreiheiten ein...


Danke
Manfred


--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------


Re: Verzeichnisse, Pfade in der URL

Posted by Emil Obermayr <no...@nobswolf.info>.
Am Sonntag, 1. Februar 2009 schrieb Manfred Rebentisch:

> Wie kann ich Apache davon
> überzeugen, den Request an meinen Handler zu übergeben, auch wenn das
> Verzeichnis nicht existiert?

Mit welchen Direktiven hast Du es denn schon versucht?

Ich denke das sollte es tun:

<Location />
  SetHandler mein_handler
</Location>

--------------------------------------------------------------------------
                Apache HTTP Server Mailing List "users-de" 
      unsubscribe-Anfragen an users-de-unsubscribe@httpd.apache.org
           sonstige Anfragen an users-de-help@httpd.apache.org
--------------------------------------------------------------------------