Umschreiben - generelle Verständnisfrage am Beispiel

Eines der wichtigsten Anwendungsgebiete von mod_rewrite ist das umschreiben von dynamischen in statische URLs um "suchmaschinenfreundliche URLs" zu erzeugen. Aber was ist besser fürs Ranking? http://www.url.com/12_2.htm, http://www.url.com/url,12,2.htm oder doch lieber http://www.url.com/12/2/url/ Fragen zum URL-Design werden hier diskutiert.

Moderator: Super-Mod

Umschreiben - generelle Verständnisfrage am Beispiel

Beitragvon Waldgeist » 20.01.2009 21:05

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
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Waldgeist » 24.01.2009 18:49

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:
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Gumbo » 24.01.2009 19:28

Das Suchmuster erwartet auch als zweites Pfadsegment einen numerischen Wert. „blabla“ ist aber nicht numerisch.
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Waldgeist » 25.01.2009 11:31

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
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Gumbo » 25.01.2009 12:02

Du musst das QSA-Flag setzen, damit die ursprüngliche Query an die neue Query angehängt wird.
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Waldgeist » 25.01.2009 18:58

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).
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Gumbo » 25.01.2009 19:00

Ich würde mich für nur eine Schreibweise entscheiden (entweder mit oder ohne „index.php“).
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Waldgeist » 25.01.2009 19:15

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.
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Waldgeist » 07.02.2009 15:25

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 :)
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Gumbo » 07.02.2009 16:03

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.
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Waldgeist » 07.02.2009 23:56

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?
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Gumbo » 08.02.2009 00:02

Was genau meinst du damit?
Markus Wulftange
Gumbo
Moderator
Moderator
 
Beiträge: 5019
Registriert: 07.01.2005 01:18
Wohnort: Trier

Beitragvon Waldgeist » 08.02.2009 00:34

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.
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Waldgeist » 10.02.2009 20:31

Tschuldigung, will nicht drängeln.

Gibt es also eine Möglichkeit die oben genannte Variante in einer Regel zu vereinen?
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Beitragvon Waldgeist » 17.02.2009 10:16

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?
Waldgeist
.
.
 
Beiträge: 29
Registriert: 15.12.2008 19:56

Nächste

Zurück zu URL-Design

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron