mod_Rewrite
Michael W.
- sonstiges
kommt mod_Rewrite in die .htaccess datei ?
ich weiss wo das glaube ich angewendet wird http://www.lr-international.de bei Berater-Login
kommt mod_Rewrite in die .htaccess datei ?
ich weiss wo das glaube ich angewendet wird http://www.lr-international.de bei Berater-Login
Hallo Michael,
kann man machen. Aber es sollte wohl besser in die httpd.conf.
Habe ich gelesen. Warum weiss ich nicht.
Kennst Du dich mit mod_rewrite aus? Oder sonst irgendjemand?
Ich habe nämlich auch eine Frage, da ich keinerlei Ahnung von regulären Ausdrücken habe:
Was für eine Regel müsste ich erstellen, damit:
alle URLs der Form "/index.php?link=variablerinhalt" beim Browser als
URL "/variablerinhalt.htm" angezeigt würden, aber tatsächlich der Inhalt des Links "/index.php?link=variablerinhalt" angezeigt würde?
Gruss,
Matthias
kann man machen. Aber es sollte wohl besser in die httpd.conf.
was ist httpd.conf. ?
Habe ich gelesen. Warum weiss ich nicht.
kennst du dich damit aus? kannst du mir deine dateien zum abschauen geben, damit ich das lerne ?
kann man machen. Aber es sollte wohl besser in die httpd.conf.
was ist httpd.conf. ?
Habe ich gelesen. Warum weiss ich nicht.
kennst du dich damit aus? kannst du mir deine dateien zum abschauen geben, damit ich das lerne ?
Da bin ich leider so schlau wie du. Sonst hätte ich nicht gefragt ;-)
Also normalerweise müsste es so aussehen (egal in welcher Datei):
RewriteEngine on
RewriteBase /
RewriteRule ^datei.htm$ /datei.htm [R]
Mit "RewriteEngine on" aktiviert du die Rewrite-Engine, dieser Eintrag ist immer notwendig.
wie so eine Regel aussehen muss weiss ich nicht genau...und ehrlich gesagt will ich es auch gar nicht wissen, ich muss nur das eben beschriebene Problem lösen!!!
RewriteEngine on
RewriteBase /
RewriteRule ^datei.htm$ /datei.htm [R]
Was bedeutet da was ?
wenn jetzt ein user sich in ein htaccess geschützte verzeichniss einloggen will soll er je nach username auf das ensprechende verzeichniss weitergeleitet werden user/username
RewriteEngine on
RewriteBase /
RewriteRule ^datei.htm$ /datei.htm [R]
Was bedeutet da was ?
wenn jetzt ein user sich in ein htaccess geschützte verzeichniss einloggen will soll er je nach username auf das ensprechende verzeichniss weitergeleitet werden user/username
Oh man, ich habe keinen Schimmer. Ich glaube die zweite ist die Datei zu der weitergeleitet würde und hoffe das sich hier mal jemand einschaltet der Ahnung von der Materie hat.
Wo bekommst du überhaupt deinen Usernamen her? und "user/username" soll das Verz. sein zu dem weitergeleitet wird?
Wo bekommst du überhaupt deinen Usernamen her?
die frage verstehe ich nicht. die usernames kann man doch beliebig viel in der .htaccess angeben.
Und "user/username" soll das Verz. sein zu dem weitergeleitet wird?
genau .../user/ ist das allgemeine und .../user/[username] soll das variable verzeichniss sein. das heisst beim einlogg versuch des users susi .../user/susi und beim andy .../user/andy
ich glaube zugriff auf die httpd.conf. haben nur wenige, deshalb: was kommt jetzt in die htaccess dazu und wie sieht eine fertige htaccess-datei für mein problem in etwa aus?
meine htaccess datei sieht jetzt so aus:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
ErrorDocument 404 http://www.djwoelk.de.vu/what.htm#3
RewriteEngine on
RewriteBase /hallo.htm
RewriteRule ^datei.htm$ /datei.htm [R]
da tut sich aber nix - wüsste gerne mal was die letzten drei zeilen für eine funktion haben.
meine htaccess datei sieht jetzt so aus:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
ErrorDocument 404 http://www.djwoelk.de.vu/what.htm#3
RewriteEngine on
RewriteBase /hallo.htm
RewriteRule ^datei.htm$ /datei.htm [R]
da tut sich aber nix - wüsste gerne mal was die letzten drei zeilen für eine funktion haben.
Bei RewritebBase musst du ein Verzeichnis angeben...frag lieber mal die Experten, ich habe keine Ahnung
meine htaccess datei sieht nun so aus:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
ErrorDocument 404 http://www.djwoelk.de.vu/what.htm#3
RewriteEngine on
RewriteBase /hallo
RewriteRule ^datei.htm$ /datei.htm [R]
da tut sich aber immer noch nix
use Mosche;
[Rewrite-Befehle in .htaccess]
kann man machen. Aber es sollte wohl besser in die httpd.conf.
was ist httpd.conf. ?
Die Datei httpd.conf ist die zentrale Konfigurationsdatei des Apachewebservers (und damit meistens nur root zugänglich). Rewrite-Befehle hier reinzutun geht also nur bei einem eigenen Server.
Habe ich gelesen. Warum weiss ich nicht.
Weil die .htaccess bei jedem Seitenaufruf neu gelesen werden muss, die in der httpd.conf gegebenen Befehle aber immer da sind. Die httpd.conf Version ist also schneller.
use Tschoe qw(Matti);
Hoi,
kann man machen. Aber es sollte wohl besser in die httpd.conf.
Habe ich gelesen. Warum weiss ich nicht.
Weil .htaccess generell eine Performance-Schwaeche ist.
Was für eine Regel müsste ich erstellen, damit:
alle URLs der Form "/index.php?link=variablerinhalt" beim Browser als
URL "/variablerinhalt.htm" angezeigt würden, aber tatsächlich der
Inhalt des Links "/index.php?link=variablerinhalt" angezeigt würde?
RewriteRule /variablerinhalt.htm /index.php?link=variablerinhalt [R,L]
Oder soll 'variablerinhalt' ein Platzhalter sein? Dann so:
RewriteRule /(.+).htm /index.php?link=$1 [R,L]
Gruesse,
c.j.k
RewriteRule /variablerinhalt.htm /index.php?link=variablerinhalt [R,L]
Oder soll 'variablerinhalt' ein Platzhalter sein? Dann so:
RewriteRule /(.+).htm /index.php?link=$1 [R,L]
Ich denke, dein zweiter Vorschlag müsste passen, da das was ich da oben als "variablerinhalt" bezeichnet habe, tatsächlich, d.h. von Link zu Link variert. Beim ersten heißt der angezeigte URL "variablerinhalt.htm" und ist nicht etwa abhänig von dem was "link= " enthält?
Ich danke Dir jedenfalls,
aber weisst du warum ich immer diese Meldeung von Apache bekomme:
Forbidden
You don't have permission to access /index.php on this server.
Ist mod_rewrite nicht richtig konfiguriert oder liegt es daran dass es in der (falschen) htaccess steht?
Hi,
aber weisst du warum ich immer diese Meldeung von Apache
bekomme:
Forbidden
You don't have permission to access /index.php on this server.
was steht in Deinem error_log?
Ist mod_rewrite nicht richtig konfiguriert oder liegt es daran
dass es in der (falschen) htaccess steht?
Es gibt eine ganze Reihe von Möglichkeiten - diese beiden gehören dazu. Deshalb sollst Du ja ins error_log schauen.
Wer seinen Server umkonfiguriert - Und genau das tust Du gerade -ist ohne error_log mehr oder weniger aufgeschmissen.
Viele Grüße
Michael
Moin, ihr!
kann man machen. Aber es sollte wohl besser in die httpd.conf.
Habe ich gelesen. Warum weiss ich nicht.
Richtig, schöner ist es in der zentralen Konfigurationsdatei httpd.conf des Apache-Servers, weil es dort "schneller wirkt". Eine Rewrite-Regel, die in der .htaccess-Datei steckt, wird erst recht spät im Verlauf des Auffindens der wirklichen Datei aktiv. Dort hat man zwar immer noch alle Möglichkeiten, aber eben vorher Zeit verschwendet, und möglicherweise doppelte Arbeit verursacht.
Wer httpd.conf nicht ändern kann, sollte sich keine Gedanken machen. Alle anderen sollten nach Möglichkeit keine .htaccess-Rewrites benutzen.
Was für eine Regel müsste ich erstellen, damit:
alle URLs der Form "/index.php?link=variablerinhalt" beim Browser als
URL "/variablerinhalt.htm" angezeigt würden, aber tatsächlich der Inhalt des Links "/index.php?link=variablerinhalt" angezeigt würde?
Herein kommt ein Link der Form "/variablerinhalt.htm". Als Regulärer Ausdruck wäre das "^/([^./]*).htm$" Die runden Klammern sagen aus: Beliebig viele Zeichen, außer dem Punkt und dem Slash.
Das soll gewandelt werden in "/index.php?link=variablerinhalt", oder allgemeiner gesagt in "/index.php?link=$1". $1 ist der Inhalt der ersten runden Klammer.
So ergibt sich folgende RewriteRule:
RewriteRule ^/([^./]*).htm$ /index.php?link=$1
Möglicherweise macht es Sinn, die RewriteRule durch ein paar RewriteCond-Angaben zu mildern.
Sie sollte jedenfalls keinerlei Auswirkungen auf die PHP-URLs haben, denn wenn der erste Ausdruck nicht "matcht", dann wird auch nichts umgeschrieben - IMHO.
- Sven Rautenberg
Hallo Sven,
vielleicht habe ich mich verwirrend ausgedrückt, vielleicht habe ich dich eben aber auch falsch verstanden (habe keine Ahnung von den Ausdrücken - danke für die Erläuterungen)
Irritiert hat mich deine Aussage
Herein kommt ein Link der Form "/variablerinhalt.htm".
Folgender Sachverhalt:
der URL lautet: /index.php?link=irgendwas
der im Browser angezeigte URL soll sein: /irgendwas.htm
der angezeigte Inhalt soll aber der sein von: /index.php?link=irgendwas (greift auf eine andere Datei zu)
Eine Datei "/irgendwas.htm" existiert also nicht und soll auch nie existieren noch soll irgendwann von ihr weitergeleitet werden noch ihr inhalt angezeigt werden.
oder geht das so herum gar nicht? und was sagst du zu der Regel die Christian gepostet hat?
DANKE!
Moin auch nochmal!
Folgender Sachverhalt:
- der URL lautet: /index.php?link=irgendwas
- der im Browser angezeigte URL soll sein: /irgendwas.htm
Das kann nicht funktionieren. Der Browser zeigt traditionell (mit Ausnahme von Frames) die angeforderte URL an. Wenn da also "/irgendwas.htm" stehen soll, muß auch "/irgendwas.htm" angefordert werden.
Das widerspricht aber Satz 1: Die URL ist dann eben _nicht_ "/index.php?link=irgendwas", sondern "/irgendwas.htm", und wird nur serverintern umgeschrieben - wovon der Browser nichts merken muß, wenn er nicht einen Redirect erhält.
Mit anderen Worten: Du kannst mit URL-Rewriting ein URL-Schema entwerfen, welches mit der tatsächlichen Anordnung der Daten auf der Festplatte und den Skripten absolut nichts zu tun hat. Dann müssen aber auch die Links entsprechend gestaltet sein, damit die richtige URL im Browser angezeigt wird.
Ich sitze gerade an sowas: Ein PHP-Skript includet HTML-Fragmente, welche so verteilt sind, wie es vollständige HTML-Seiten wären. Eine Rewriting-Regel setzt aber die URL um, damit das PHP-Skript zum Zuge kommt. Aus "/pfad/pfad/datei.html" wird intern "/index.pgp?/pfad/pfad/datei.html", und das PHP-Skript wertet dann den URL-Parameter aus. Zur Sicherheit wird durch eine Rewrite-Bedingung vorher geprüft, ob die HTML-Datei vorhanden ist - nur dann wird die Umschreibung gestartet. So kann niemand dem PHP-Skript URLs unterjubeln, die nicht existieren (das Skript prüft den übergebenen Parameter aber auch nochmal).
- Sven Rautenberg
Folgender Sachverhalt:
- der URL lautet: /index.php?link=irgendwas
- der im Browser angezeigte URL soll sein: /irgendwas.htm
Das kann nicht funktionieren. Der Browser zeigt traditionell (mit Ausnahme von Frames) die angeforderte URL an. Wenn da also "/irgendwas.htm" stehen soll, muß auch "/irgendwas.htm" angefordert werden.
Das widerspricht aber Satz 1: Die URL ist dann eben _nicht_ "/index.php?link=irgendwas", sondern "/irgendwas.htm", und wird nur serverintern umgeschrieben - wovon der Browser nichts merken muß, wenn er nicht einen Redirect erhält.
Mit anderen Worten: Du kannst mit URL-Rewriting ein URL-Schema entwerfen, welches mit der tatsächlichen Anordnung der Daten auf der Festplatte und den Skripten absolut nichts zu tun hat. Dann müssen aber auch die Links entsprechend gestaltet sein, damit die richtige URL im Browser angezeigt wird.
Ok. Das will ich ja. Ich bin verwirrt. Nochmal um das klar zu stellen für mich als Beginner. Ich möchte, dass man als URL eingibt: "www.domain.de/irgendwas.htm" (und ich auch meine Verlinkungen innerhalb der Site so setzte) und das serverintern umgeschrieben wird in beispielsweise "index.php?link=irgendwas", dieses Skript generiert dann wie bei Dir aus HTML-Fragmenten eine
komplette Seite und prüft dazu ob eine Datei z.B. "/pfad/irgendwas.htm" vorhanden ist und includet diese dann. Ok, klingt ünnötig kompliziert und überflüssig, aber ich gehe doch recht in der Annahme, dass dafür die Datei "/irgendwas.htm" nicht vorhanden sein muss ("/pfad/irgendwas.htm" natürlich schon)??? Und deine Regel RewriteRule ^/([^./]*).htm$ /index.php?link=$1
funktionieren müsste. Warum bekomme ich von Apache immer "Forbidden" angezeigt?
Wegen Suchmaschinen und Benutzungsfreundlichkeit möchte ich nur nicht einen URL mit Parametern "/index.php?link=irgendwas" als Adresse stehen haben sondern eben einfach "/irgendwas.htm"
Wenn das nicht geht, bringt mir mod_rewrite nichts, dann kann ich auch einfach eine Datei (für jede Datei!! ugh) im root-Verz. erstellen und in dieser index.php mit $link=irgendwas aufrufen.
Ich sitze gerade an sowas: Ein PHP-Skript includet HTML-Fragmente, welche so verteilt sind, wie es vollständige HTML-Seiten wären. Eine Rewriting-Regel setzt aber die URL um, damit das PHP-Skript zum Zuge kommt. Aus "/pfad/pfad/datei.html" wird intern "/index.pgp?/pfad/pfad/datei.html", und das PHP-Skript wertet dann den URL-Parameter aus. Zur Sicherheit wird durch eine Rewrite-Bedingung vorher geprüft, ob die HTML-Datei vorhanden ist - nur dann wird die Umschreibung gestartet. So kann niemand dem PHP-Skript URLs unterjubeln, die nicht existieren (das Skript prüft den übergebenen Parameter aber auch nochmal).
Warum ist zur Sicherheit diese Rewrite-Bedingung nötig? Wenn die Datei nicht vorhanden ist, kann man doch über das PHP-Skript die Startseite aufrufen lassen bzw. die 404-Seite wird angezeigt.
Sprich, es könnte doch einfach plump aus "/pfad/pfad/datei.html" immer intern "/index.pgp?/pfad/pfad/datei.html" werden und in index.php überprüft werden, ob "/pfad/pfad/datei.html" vorhanden ist.
Was spricht dagegen?
Vielleicht verstehe ich auch gar nichts mehr und bin einfach zu doof dafür :-(
Gruss,
Matthias
- Sven Rautenberg
Moin!
Mit anderen Worten: Du kannst mit URL-Rewriting ein URL-Schema entwerfen, welches mit der tatsächlichen Anordnung der Daten auf der Festplatte und den Skripten absolut nichts zu tun hat. Dann müssen aber auch die Links entsprechend gestaltet sein, damit die richtige URL im Browser angezeigt wird.
Intro: Mal einen Absatz im Text machen hilft, ihn beim Lesen zu verstehen und erleichtert auch das abschnittweise Zitieren. Nur so zur Info... ;)
Ok. Das will ich ja. Ich bin verwirrt. Nochmal um das klar zu stellen für mich als Beginner. Ich möchte, dass man als URL eingibt: "www.domain.de/irgendwas.htm" (und ich auch meine Verlinkungen innerhalb der Site so setzte) und das serverintern umgeschrieben wird in beispielsweise "index.php?link=irgendwas"
PUNKT. :)
Wenn du das willst, mach's doch einfach.
Und deine Regel RewriteRule ^/([^./]*).htm$ /index.php?link=$1 funktionieren müsste. Warum bekomme ich von Apache immer "Forbidden" angezeigt?
Was weiß ich, warum. Die URL muß vorher nicht existieren, aber hinterher. Zu Debugging-Zwecken empfiehlt es sich vielleicht:
1. Die Regel zu einer Redirect-Regel zu machen, also in eckigen Klammern am Ende der RewriteRule ein [R] anzuhängen. Dann siehst du, wohin die Regel dich führt, anhand der URL-Zeile.
2. Das error_log zu betrachten oder gar
3. Die Konfiguration für ein RewriteLog-File zu setzen, damit du siehst, was passiert.
Wegen Suchmaschinen und Benutzungsfreundlichkeit möchte ich nur nicht einen URL mit Parametern "/index.php?link=irgendwas" als Adresse stehen haben sondern eben einfach "/irgendwas.htm"
Wenn das nicht geht, bringt mir mod_rewrite nichts, dann kann ich auch einfach eine Datei (für jede Datei!! ugh) im root-Verz. erstellen und in dieser index.php mit $link=irgendwas aufrufen.
Doch, das geht. Es war bei mir auch etwas Gefrickel, aber letztendlich hat es hingehauen.
Zur Sicherheit wird durch eine Rewrite-Bedingung vorher geprüft, ob die HTML-Datei vorhanden ist - nur dann wird die Umschreibung gestartet. So kann niemand dem PHP-Skript URLs unterjubeln, die nicht existieren (das Skript prüft den übergebenen Parameter aber auch nochmal).
Warum ist zur Sicherheit diese Rewrite-Bedingung nötig? Wenn die Datei nicht vorhanden ist, kann man doch über das PHP-Skript die Startseite aufrufen lassen bzw. die 404-Seite wird angezeigt.
Klar könnte man es auch so machen lassen. Nur würde ohne Bedingung das Skript _immer_ aufgerufen, wenn eine ".html"-Seite auszuliefern ist. Mit Bedingung wird das auf die Fälle begrenzt, wo wirklich etwas lieferbar ist - die anderen Fälle regelt der Webserver dann selber, indem er 404 ausgibt. Was nun günstiger ist, ist eben die Frage. Ich fand meine Lösung gut, als sie mir einfiel. Das kann sich aber durchaus auch wieder ändern.
Mir gefällt einfach der Gedanke besser, daß der Webserver nicht das Skript mit irgendwelchen URLs bewirft, die nicht existieren.
Abgesehen davon ist URL-Rewriting eine ziemlich coole Sache, wenn man weiß, wie es funktioniert - und ein wenig Experimentieren steckt auch da drin.
Vielleicht verstehe ich auch gar nichts mehr und bin einfach zu doof dafür :-(
``The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Sendmail.''
:)
- Sven Rautenberg
mod_rewrite kann hier irgendwie keiner richtig klar machen.
stellt euch vor:
im verzeichniss .../user/ ist eine htaccess und eine htpsswd.
jeder der darauf zugreifen will wird nach username und passwort abgefragt (wie hier[link http://www.plascha.de/djwoelk/login/]).
so: es gibt verschiedene user (beispiel .htaccess):
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
der user "user3" möchte sich in [link http://www.plascha.de/djwoelk/login/] einloggen.
hat er das erfolgreich gemacht, so wird sie in das verzeichniss meiner wahl umgeleitet:
wie geht das ? Das problem ist doch jetzt so deutlich wies nur geht.
Bitte helft mir. Danke
Hi,
mod_rewrite kann hier irgendwie keiner richtig klar machen.
jetzt jammer mal nicht so rum.
mod_rewrite hat die Komplexität einer vollständigen Programmiersprache.
So etwas zu vermitteln geht nicht in drei Sekunden.
im verzeichniss .../user/ ist eine htaccess und eine htpsswd.
Im Verzeichnis selbst?
Da sollten die Passwort-Definitionen aber bestimmt nicht liegen.
jeder der darauf zugreifen will wird nach username und passwort
abgefragt (wie hier[link http://www.plascha.de/djwoelk/login/]).
Und sendet diese Informationen in einem HTTP-Header mit:
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.8
mod_rewrite kann sowohl in Bedingungen als auch in zu verarbeitenden
Strings Inhalte von HTTP-Header-Feldern verwenden - Syntax: %{name}.
Jetzt müßtest Du den Inhalt dieses Headers nur noch verstehen ...
dann könntest Du ihn dynamisch in den Ziel-String einsetzen lassen.
- require user susi -
- require user gabi -
- require user user3 -
- require user user4 -
Du weißt, daß es auch "require valid-user" gibt?
- require user susi - in - http://www.plascha.de/djwoelk/susi
- require user gabi - in - http://www.plascha.de/djwoelk/user2
- require user user3 - in - http://www.plascha.de/djwoelk/user3
- require user user4 - in - http://www.plascha.de/djwoelk/egal
Ein Beispiel ist keine Aufgabenstellung.
Möchtest Du ein generisches Verfahren, das für beliebige Mengen von
Benutzerkennungen funktioniert - oder diese vier Namen fest verdrahtet?
Das ist ein erheblicher Unterschied!
wie geht das ? Das problem ist doch jetzt so deutlich wies nur geht.
Dir vielleicht. Wenn Du die diversen impliziten Annahmen nun bitte
auch _alle_ mit dazu schreiben würdest ...
Bitte helft mir.
Dazu mußt Du aber auch sagen, was _genau_ Du willst ...
Viele Grüße
Michael
Moin!
mod_rewrite kann hier irgendwie keiner richtig klar machen.
Es gibt reichhaltige Beispielkonfigurationen und eine recht umfangreiche Dokumentation zu mod_rewrite, alles auf dem Apache-Server.
Außerdem gibts Google, welches, befragt nach "mod_rewrite deutsch" unter anderem folgende URL ausspuckte: http://www.heise.de/ix/artikel/1996/12/149/. Ein Artikel aus dem Jahre 1996 über mod_rewrite, mitgeschrieben von Ralf S. Engelschall, dem (Mit-?)Autoren von mod_rewrite.
Selber lesen und probieren macht auch schlau. Vielleicht solltest du dein Augenmerk auch mal auf die Log-Möglichkeiten legen. RewriteLog unr RewriteLogLevel sind dafür geeignet.
stellt euch vor:
im verzeichniss .../user/ ist eine htaccess und eine htpsswd.
jeder der darauf zugreifen will wird nach username und passwort abgefragt (wie hier[link http://www.plascha.de/djwoelk/login/]).
der user "user3" möchte sich in [link http://www.plascha.de/djwoelk/login/] einloggen.
hat er das erfolgreich gemacht, so wird sie in das verzeichniss meiner wahl umgeleitet:
- require user susi - in - http://www.plascha.de/djwoelk/susi
- require user gabi - in - http://www.plascha.de/djwoelk/user2
- require user user3 - in - http://www.plascha.de/djwoelk/user3
- require user user4 - in - http://www.plascha.de/djwoelk/egal
wie geht das ? Das problem ist doch jetzt so deutlich wies nur geht.
In der Tat ist das deutlich. Das Problem ist: Das klappt so schon aus anderen Gründen nicht, nämlich wegen dem Geltungsbereich des Paßwortes.
Du mußt ja, um einigermaßen Sicherheit zu haben, jedes Userverzeichnis so schützen, daß nur der jeweilige Benutzer Zugriff hat. Nach meiner Ansicht funktioniert das aber nur, wenn du den Zugriff nach und nach filterst. Also so:
/login/ <- Hier kommt man nur mit Paßwort rein.
/login/user1/ <- Hier kommt nur ein User rein.
/login/user2/ <- Hier kommt nur ein anderer User rein.
Wenn du die Verzeichnisse so strukturierst, dann gilt die Login-Eingabe in /login/ auch noch für die Unterverzeichnisse (wird vom Browser automatisch mitgeschickt) - dort kannst du unpassende Benutzer aber durch schärfere "require user"-Regeln aussperren. Für /login/ dürfen eben alle User, in die Unterverzeichnisse darf jeweils nur einer. Dazu brauchst du nur eine .htaccess-Datei in jedem Unterverzeichnis mit den identischen Angaben wie in /login/ - einziger Unterschied sind weniger "require user". Die Paßwortdatei wird nicht verdoppelt.
So, und jetzt ist die Frage: Wie kriegt man da jetzt mod_rewrite unter? Gehen wir doch mal gedanklich durch:
1. Jemand klickt auf einen "Login"-Link oder ruft /login/ aus den Bookmarks auf.
2. Dadurch kriegt er erst einmal den Login-Schirm durch den Browser vorgesetzt, weil der Server mit Statuscode 401 antwortet.
3. Wenn er richtig antwortet, kriegt er die Index-Datei, die sich in /login/ befindet, regulär ausgeliefert (200 OK).
Was soll passieren? Soll er die Index-Datei aus /login/ kriegen, oder soll er gleich weitergeleitet werden nach /login/USERNAME/?
Dafür hätte ich was:
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]
Erklärung: Wie dieses Bild zeigt, wird zuerst die Rewrite-Rule angefangen: <img src="http://httpd.apache.org/docs/images/mod_rewrite_fig2.gif" border=0 alt="">
Also wird hier getestet, ob die URL exakt ^/login/$ entspricht. Das ist etwas unflexibel, wenn die Login-Seite nicht so aufgerufen wurde. Nachbesserung überlasse ich dir.
Wenn die URL paßt, wird die RewriteCond geprüft. In diesem Falle teste ich die Server-Variable REMOTE_USER - da steht drin, mit welchem Namen sich der Benutzer angemeldet hat. Ich setze diesen Wert in runde Klammern, weil ich ihn später noch brauche. Runde Klammern sind bei regulären Ausdrücken ja wichtig.
Die Bedingung für den Usernamen: Er muß mindestens 1 Zeichen lang sein (das sagt ^.+$).
Wenn die Bedingung erfüllt ist, wird die URL umgeschrieben. Und zwar zu /login/%1/. Das %1 ist laut Dokumentation der Pattern aus der RewriteCond. Da dort nur eine Klammer ist, und die um den Usernamen gemacht wurde, steht also in %1 der Username. Mit $1 kriegt man übrigens Bestandteile aus der RewriteRule.
Die Parameter [L,R] sagen: Letzte Regel (danach werden keine weiteren mehr ausgeführt, wenn diese gepaßt hat), und Redirect (der Browser zeigt die neu gefundene URL an).
Verbesserungsansätze: Auch /login/index.html sollte irgendwie weiterleiten. Dabei kommt dir zuhilfe, daß es keine Unterverzeichnisse geben sollte, die allen Usern zugänglich sind. Deshalb kannst du z.B. abfragen, ob noch ein Dateiname hinter /login/ steht, der aber kein "/" enthalten darf (sonst wäre das ja ein Unterverzeichnis). Was du mit dem Dateinamen dann in der neuen URL machst, bleibt dir überlassen. Du kannst ihn grundsätzlich abschneiden, oder auch wieder hinter dem Usernamen anfügen.
- Sven Rautenberg
Erstaml ein dickes Dankeschön an dich und die mühe die du dir schon gemacht hast. meine htaccess sieht jetzt so aus
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]
ErrorDocument 404 http://www.plascha.de/djwoelk/what.htm#3
wobei sich immernoch nichts tut, ich werde mich jetzt nochmal einwenig damit beschäftigen, aber wer noch was zu verbessern hat (wenn es ein kleinigkeits fehler ist zb ne klammer zuviel oder sowas), dann ruhig Posten.
ich logge mich mit dem namen "djwoelk" in das verzeichniss .../login/ ein dabei sollte ich doch auf .../login/djwoelk/ weitergeleitet werden der ordner .../login/djwoelk/ beinhalten eine index.htm (falls das wichtig für die funktion ist).
was nun ?
Danke an alle. :)
Moin!
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteEngine on
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]
ErrorDocument 404 http://www.plascha.de/djwoelk/what.htm#3
wobei sich immernoch nichts tut
Definiere "nichts tut". Irgendwas muß passieren. Entweder wirst du nicht weitergeleitet, oder du kommst garnicht erst rein, oder...
- Sven Rautenberg
Definiere "nichts tut".
ich werde nicht weitergeleitet. ich logge mich ein und alles ist so wie vorher sowie mit der alten htaccess-datei. die so aussah:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
ErrorDocument 404 http://www.plascha.de/djwoelk/what.htm#3
die jetzige sieht so aus:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteEngine on
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]
ErrorDocument 404 http://www.plascha.de/djwoelk/what.htm#3
aber genau da passiert genau das gleiche, wie bei der alten !!?!
Yo!
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteEngine on
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/$ /login/%1/ [L,R]
ErrorDocument 404 http://www.plascha.de/djwoelk/what.htm#3
Vielleicht sollten wir mal etwas an der RewriteRule rumändern:
RewriteRule ^/login/([^/]*)$ /login/%1/$1 [L,R]
Hinter dem /login/ kann irgendein vorhergehende Modul wie z.B. mod_index (das ist für die Auslieferung der Index-Datei zuständig) ja z.B. schon "index.html" eingetragen haben, auch wenn du im Browser nur "/login/" stehen hast. Insofern sollte dieser Fall abgefangen werden: Wenn hinter "/login/" noch was steht, was keinen "/" enthält, dann wird dieses eben gefunden und hinter den Usernamen wieder angefügt.
Teste mal. Und ansonsten probiere es mit Logfiles. RewriteLog und RewriteLogLevel sind deine Freunde, und deren Doku steht hier: http://httpd.apache.org/docs/mod/mod_rewrite.html#RewriteLog Das sind vermutlich die am leichtesten zu verstehenden Befehle, die mod_rewrite kennt. :)
Wenn ich mir deinen .htpasswd-Pfad so ansehe, sollte es so gehen:
RewriteLog /homepages/5/d38530746/htdocs/djwoelk/login/rewrite.log
RewriteLogLevel 3 (zwischen 0 und 9 ist erlaubt)
Ich habe keine Ahnung, was bei Level 3 rauskommt - sieh's dir einfach mal an. Und lege vielleicht vorher die Datei rewrite.log an und gibt Schreibrechte an alle: chmod 666. Sonst kann es sein, daß der Webserver die unter seiner ID anlegt und du nicht mehr rankommst oder sie nicht löschen kannst.
- Sven Rautenberg
was kommt in die rewrite.log ?
aktueller stand der htaccess:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteEngine on
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/([^/]*)$ /login/%1/$1 [L,R]
RewriteLog /homepages/5/d38530746/htdocs/djwoelk/login/rewrite.log
RewriteLogLevel 3
ist die so ok ???
in der rewrite.log steht nix. geht es jetzt deshalb nicht?
was kommt in die rewrite.log ?
Nichts, einfach eine leere 0-Byte-Datei nehmen.
aktueller stand der htaccess:
AuthType Basic
AuthName "USER-LOGIN"
AuthUserFile /homepages/5/d38530746/htdocs/djwoelk/login/.htpasswd
require user djwoelk
require user webmaster
RewriteEngine on
RewriteCond (%{REMOTE_USER}) ^.+$
RewriteRule ^/login/([^/]*)$ /login/%1/$1 [L,R]
RewriteLog /homepages/5/d38530746/htdocs/djwoelk/login/rewrite.log
RewriteLogLevel 3
ist die so ok ???
Ich würde sie auch so schreiben.
in der rewrite.log steht nix. geht es jetzt deshalb nicht?
Wenn's nicht geht, kann das immer noch daran liegen, daß du kein Rewriting machen kannst, weil der Server es nicht eingeschaltet hat. Ohne Angaben aus dem Error-Logfile des Servers ist das schwer zu beurteilen.
Testweise nimm doch einfach mal RewriteCond und RewriteRule raus und ersetze sie durch diese RewriteRule:
RewriteRule (.*).123$ $1.html [R]
Wenn du /login/index.123 eingibst, solltest du eigentlich auf der index.html landen. Das ist eine sehr simple Regel, die eigentlich funktionieren sollte. Wenn sie das nicht tut, ist Rewriting möglicherweise ausgeschaltet - frage deinen Provider danach.
- Sven Rautenberg
Testweise nimm doch einfach mal RewriteCond und RewriteRule raus und ersetze sie durch diese RewriteRule:
RewriteRule (.*).123$ $1.html [R]
Wenn du /login/index.123 eingibst, solltest du eigentlich auf der index.html landen. Das ist eine sehr simple Regel, die eigentlich funktionieren sollte. Wenn sie das nicht tut, ist Rewriting möglicherweise ausgeschaltet - frage deinen Provider danach.
jetzt bin ich sowas von verwirrt:
also ich gebe .../login/index.123 ein und komme zur errorfile des plaschaservers http://www.plascha.de/error/404.htm
gebe ich anderen quatsch ein, sowie .../login/blablub.htm was es auch nicht gibt, dann komme ich zur error file von meiner seite http://www.plascha.de/djwoelk/what.htm#3
das heisst doch das es geht oder?
Moin!
jetzt bin ich sowas von verwirrt:
also ich gebe .../login/index.123 ein und komme zur errorfile des plaschaservers http://www.plascha.de/error/404.htm
gebe ich anderen quatsch ein, sowie .../login/blablub.htm was es auch nicht gibt, dann komme ich zur error file von meiner seite http://www.plascha.de/djwoelk/what.htm#3
das heisst doch das es geht oder?
Nö, geht nicht. Wenn /login/index.html vorhanden ist, solltest du von /login/index.123 auf /login/index.html umgeleitet werden. Wenn das nicht geht, gehts nicht. Und so sieht es aus.
Provider fragen, ob mod_rewrite funktionieren soll/kann! Wenn nein, dann kannst du dir weitere Versuche sparen.
- Sven Rautenberg
HI
das ist der 1&1 Server - kann das trotzdem sein, dass mein berreich ausgeschaltet ist ? wen soll ich überhaupt anmailen um zu ergebnissen zu kommen ?
Moin!
das ist der 1&1 Server - kann das trotzdem sein, dass mein berreich ausgeschaltet ist ? wen soll ich überhaupt anmailen um zu ergebnissen zu kommen ?
Du hast ein Konfigurationsmenü, dort Zugriff auf die FAQ, und sicherlich auch ein Kontaktformular für den EMail-Support. Wissen tu ich es nicht genau, ich hab den Support noch nie gebraucht. Aber ich erwarte eigentlich auch nicht, daß in meinem Web-Paket sowas wie mod_rewrite funktioniert. :)
- Sven Rautenberg
RewriteRule ^/login/([^/]*)$ /login/%1/$1 [L,R]
was bedeutet da was ?
^ = vorherliegendes verzeichniss so wie wenn ich schrieben würde .../login/...
([^/]*) = das * soll eine variable sein, oder ?
das $ sagt mir garnichts
/login/% = das % ist die variable für den user, doch was soll die 1
müsste das nicht so aussehen:
RewriteRule ^/login/([^/]*)$ ^/login/% [L,R]
RewriteRule ^/login/([^/]*)$ /login/%1/$1 [L,R]
was bedeutet da was ?
Es sind ja zwei Teile: Einmal das Muster, nach dem gesucht wird, und dann das Muster, welches neu zusammengesetzt wird.
^/login/([^/]*)$
Das ist das Suchmuster - ein regulärer Ausdruck.
^ - Zeilenanfang. Bedeutet: Der String muß mit dem, was danach kommt, anfangen, es sind keine Zeichen davor erlaubt.
/login/ - Der String "/login/"
([^/]*) - Das zerfällt in
[^/] - Beliebige Zeichen, die kein "/" sind (^ hat hier eine andere Bedeutung).
* - Beliebig viele (0 bis unendlich) des vorhergehenden (also [^/]).
( ) - Der Inhalt der Klammern steht später als Variable zur Verfügung (hier genauer: als $-Variable. Und da es die erste Klammer im Ausdruck ist, eben als $1).
$ - Zeilenende. Genau wie am Anfang muß der String mit dem vorhergeneden Zeichen enden.
Zweiter Teil:
/login/%1/$1
Hier kommen nur ganz normale Zeichen und Variablen vor.
/login/ - die Zeichenkette "/login/"
%1 - Die erste Klammer aus der RewriteCond - also der Username.
/ - Die Zeichenkette "/"
$1 - Die erste Klammer aus der RewriteRule - also das, was als ([^/]*) gefunden wurde.
müsste das nicht so aussehen:
RewriteRule ^/login/([^/]*)$ ^/login/% [L,R]
Nö, denn was heißt "%"? Dahinter ist zwingend eine Ziffer anzugeben.
Wenn du von /login/irgendwas.html auf /login/djwoelk/irgendwas.html umgeleitet werden willst, muß die Regel eher so aussehen, wie ich geschrieben habe - Fehler darin sind aber natürlich möglich.
- Sven Rautenberg
hi
mod_rewrite kann hier irgendwie keiner richtig klar machen.
..scheint mir auch ansatzweise so.. was zweierlei bedeuten kann:
1. das Programm ist zu kompliziert
2. hier sind alle zu blöd zu erlären
...da das mit dem Erklären sonst ja anscheinend klappt schieben wir's auf's Programm ;}
Grüße aus Bleckede
Kai
p.s. ich hab davon auch 0 Plan, welhab mein Apache immer die bittere Wahrheit sagt *g*