Seite 1 von 2

Umschreiben - generelle Verständnisfrage am Beispiel

Verfasst: 20.01.2009 21:05
von Waldgeist
Hallo ihr, Hallo Gumbo,

ich habe mal eine grundlegende Frage. Habe die Grundlagen für mod_rewrite lokal soweit eingerichtet, dass alles funktioniert (die Weiterleitung auf google und auch ein kleines Testscript).

Folgendes will ich damit jetzt realisieren:
Ich habe eine Datei, die index.php . Neben der index.php liegt eine andere Datei, zB test.php und außerdem die .htaccess Datei.
In der URL soll allerdings nicht domain.de/index.php?site=bla sondern, denke das sollte eh klar sein in dem Forum hier, domain.de/bla stehen.


Als Vorlage und zum Testen diente mir dieser Eintrag:

Code: Alles auswählen

Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([a-zA-Z]+)/((\d{4})/((\d{2})/((\d{2})/([^/]+)?)?)?)?$ /index.php?Bereich=$1&Jahr=$3&Monat=$5&Tag=$7&Datei=$9 [L]


Das also versucht und im Browser aufgerufen:
http://localhost/test/ (hier geht es dann los, das ist das Verzeichnis mit der index, test und htaccess Dateien.

Der Vorlage zufolge habe ich versucht darauf zuzugreifen und einfach ein paar parameter angehängt:
http://localhost/test/blabla/2007/10/9/download -> das hat schonmal nicht funktioniert, wenn ich allerdings hinter das http://localhost/test/ noch irgend was gestellt habe, wurde immerhin schonmal der Testeintrag der index.php ausgegeben.

Wenn ich aber versucht habe die Variablen (zB Bereich oder Jahr) aufzurufen mit ($_GET und testweise auch über $_SERVER['REQUEST_URI']), kam nichts.


Da setzt jetzt also meine Frage an.
1. Wie kriege ich den vorgestellten Ordner weg?
2. Wie kann ich auf die Variablen zugreifen?
3. Wenn ich dort jetzt noch "echte" Variablen übergeben will, zB action=siteX , kann ich das einfach dahinter anhängen?
Also zB (bei einer kurzform) http://localhost/test/VARIABLE_VERSTECK ... =1&b=2&usw ?

Vielen Dank für die Informationen und euch einen schönen Abend.
Gruß, Jonas

Verfasst: 24.01.2009 18:49
von Waldgeist
hmm, hat keiner eine Idee ? Oder war die Frage eine "auf diese Frage werden wir nicht antworten" Frage, weil es dazu 1000 Informationen gibt (die ich bisher leider nicht gefunden habe ...) ?

Danke :roll:

Verfasst: 24.01.2009 19:28
von Gumbo
Das Suchmuster erwartet auch als zweites Pfadsegment einen numerischen Wert. „blabla“ ist aber nicht numerisch.

Verfasst: 25.01.2009 11:31
von Waldgeist
Hmm, ich bin davon ausgegangen, dass der Anfang ein Textbild sein muss: ([a-zA-Z]+)
Aber scheinbar gilt das dann für alle Ordner. Ganz klar ist es mir nicht, aber ist auch nicht so wichtig.
Ich habe mir einfach noch mal ein anderes Beispiel rangezogen und dieses modifiziert/angepasst.

Das sieht jetzt wie folgt aus und funktioniert grundlegend:

Code: Alles auswählen

Options +FollowSymlinks
RewriteEngine On

## Altes Suchmuster
#RewriteRule ^temp_([0-9]+)_(.*).htm$ rewrite.php?id=$1&a=14&b=eur&sp=$2

## modifiziertes Suchmuster
RewriteRule ^(.*)/$ rewrite.php?id=$1

Dabei bleibt mir nur noch eine Frage.

Wenn ich jetzt als Adresse eingebe: http://localhost/rewrite/mam/?action=3&test=hund ,
dann gibt er mir in der rewrite.php aus:
/rewrite/mam/?action=3&test=hund <- ($_SERVER['REQUEST_URI'])
rewrite ID: mam

Versuche ich aber auf die anderen Variablen zuzugreifen ($_GET[action] oder $_GET[test]), dann kriege ich keinen Inhalt.
Dabei sind sie unter der request_uri doch zu finden. Muss ich grundlegend alle Variablen über den Rewrite Prozess übergeben damit das funktioniert?

Kann mir da jemand weiterhelfen? Gern auch einen Link.
Vielen Dank

Verfasst: 25.01.2009 12:02
von Gumbo
Du musst das QSA-Flag setzen, damit die ursprüngliche Query an die neue Query angehängt wird.

Verfasst: 25.01.2009 18:58
von Waldgeist
Perfekt ... vielen Dank Gumbo. So wie ich mir das vorgestellt habe, funktioniert das jetzt.
Und hier noch mal kompletten Datein, vielleicht hilft dieses einfache Beispiel ein paar weiteren Leuten beim verstehen.


.htaccess

Code: Alles auswählen

Options +FollowSymlinks
RewriteEngine On
RewriteRule ^(.*)/index.php$ rewrite.php?id=$1 [QSA]
RewriteRule ^(.*)/$ rewrite.php?shopid=$1 [QSA]


rewrite.php

Code: Alles auswählen

<?php 

echo "rewrite ID: $_GET[id]<br><br>";

echo "<form action=\"index.php\" method=\"POST\">";
echo "<input type=\"hidden\" name=\"action\" value=\"login\"></input>";
echo "<input type=\"submit\" value=\"Senden POST\"></input>";
echo "</form>";

echo "<form action=\"index.php\" method=\"GET\">";
echo "<input type=\"hidden\" name=\"action\" value=\"login\"></input>";
echo "<input type=\"submit\" value=\"Senden GET\"></input>";
echo "</form>";

if($_GET[action]=="login") echo "SENDEN GET erfolgreich!";
if($_POST[action]=="login") echo "SENDEN POST erfolgreich!";

?>


Wird nun im Browser eine der Adressen aufgerufen:
http://localhost/rewrite/mam/index.php
http://localhost/rewrite/mam/
hat man den Eintrag (in dem Fall) "mam" angezeigt, dieser kann beliebig ersetzt werden.
Die index.php Variante musste ich einbauen, da man das Formular nicht per POST an einen Ordner senden kann (mir zumindest kein Web bekannt).

Verfasst: 25.01.2009 19:00
von Gumbo
Ich würde mich für nur eine Schreibweise entscheiden (entweder mit oder ohne „index.php“).

Verfasst: 25.01.2009 19:15
von Waldgeist
Wegen der Bearbeitungsdauer? Oder gibt es andere Gründe die dafür sprechen?
Problem ist halt wie beschrieben, dass man formulare nur auf diese Weise absenden kann (oder geht es anders?).
Und der User soll auf jeden Fall über die URL domain.de/VARIABLE auf die Seite kommen können.
Immer index.php dazu eingeben zu müssen, wäre belastend.

Verfasst: 07.02.2009 15:25
von Waldgeist
So, nochmal zurück zu meinem Problem. Du meintest, es sei Sinnvoller sich für eine Variante zu entscheiden.
Mein Problem ist jetzt folgendes:

Die Seite läuft über domain.de . Jetzt soll jeder User seine Seite über
- domain.de/user

erreichen können. Allerdings nicht nur über exakt diese Eingabe
- domain.de/user
sondern auch über
- domain.de/user/
- domain.de/user/SEITE.php
wobei die SEITE variiert.

Muss das irgend wie über RewriteCond laufen? Oder geht das auch nur über eine RewriteRule ?

Vielen Dank. Ach und allen ein schönes Wochenende :)

Verfasst: 07.02.2009 16:03
von Gumbo
Dazu müsstest du das Suchmuster spezifizieren, da „.*“ auf alle möglichen Zeichenfolge (auch die der Länge 0) zutrifft. Der Ausdruck „[^/]+“ beschreibt dagegen nur Zeichenfolgen, bestehend aus mindestens einem Zeichen ungleich dem Schrägstrich. Dadurch kannst du einzelne Pfadsegmente beschreiben.

Verfasst: 07.02.2009 23:56
von Waldgeist
was dann wohl heißt:

Code: Alles auswählen

RewriteRule ^([^/]+)/([^/]+)$ $2?var=$1 [QSA]


Das zumindest scheint zu funktionieren. Langsam wirds mir immer klarer. Vielen Dank dafür.

Jetzt fehlt mir eigentlich nur noch eins. Wenn ich das ganze jetzt ohne php file angebe, dann geht es wieder nicht.
Kann man das noch auf eine elegante Art integrieren?

Verfasst: 08.02.2009 00:02
von Gumbo
Was genau meinst du damit?

Verfasst: 08.02.2009 00:34
von Waldgeist
okay, ein Beispiel . Das sollte das ganze klarer machen :D

wir haben "domain.de". Jeder user kann seine seite nun unter "domain.de/username/" finden.
Natürlich gibt es nicht jeden Ordner, statdessen wird das ganze umgeschrieben in $user=username.
In dem Verzeichnis "domain.de/username/" gibt es jedoch mehrere Datein. So unter anderem die "index.php" und "search.php". (Liegen natürlich nicht wirklich in dem Verzeichnis da es das ja nicht gibt, aber ich denke das ist klar).

der user soll seine seite jetzt über folgende varianten erreichen können:
- domain.de/username/
- domain.de/username/index.php
- domain.de/username/search.php
- domain.de/username/other-php-files.php

Mit der oben genannten Variante fange ich die letzten drei erfolgreich ab, nicht jedoch wenn keine php Datei aufgerufen wird.

Verfasst: 10.02.2009 20:31
von Waldgeist
Tschuldigung, will nicht drängeln.

Gibt es also eine Möglichkeit die oben genannte Variante in einer Regel zu vereinen?

Verfasst: 17.02.2009 10:16
von Waldgeist
okay, habe mir selbst geholfen. Das ganze sieht jetzt wie folgt aus:

Code: Alles auswählen

RewriteRule ^([^/]+)/([^/]*)$ $2?username=$1 [QSA]



Kurz als Erläuterung für Nachfolger die ähnliches realisieren wollen:

Bei dem Aufruf von domain.de/USERNAME/FILE wird die URL umgeschrieben, dass dabei rauskommt:
domain.de/FILE?username=USERNAME

Wobei FILE nicht gesetzt werden muss, also auch domain.de/USERNAME/ aufgerufen werden kann.

Herzlichen Dank für alle Antworten.


Und da habe ich doch noch eine Frage:
Der Aufruf soll auch funktionieren, wenn man (anstelle von domain.de/USERNAME/) domain.de/Username eingibt (kein Slash am Ende).
Ist hierfür eine Rewrite Condition von nöten? Und wann ist es überhaupt sinnvoll solch eine Condition zu verwenden, also gibt es gute Gründe dafür es nicht zu tun?