Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

ganz spezielles mod rewrite

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
sanchez
PostRank 1
PostRank 1
Beiträge: 10
Registriert: 21.04.2006, 08:31

Beitrag von sanchez » 29.05.2006, 17:42

Hallo,

ich möchte bei folgender Adresse:

Code: Alles auswählen

http://www.domain.de/module/paramaterA_1/ParameterB_2/.../datei.html
dass per mod rewrite diese Seite aufgerufen wird:

Code: Alles auswählen

http://www.domain.de/index.php?parameterA=1&parameterB=2
die Anzahl der Parameter ist dabei beliebig (also auch die Ordner verschachtelung)...

leider bekomme ich die Regel irgendwie nicht hin...

bisher habe ich folgendes:

Code: Alles auswählen

RewriteRule ^module\/(.*?)_(.*?)\/.*?.html$ index.php?$1=$2
ich komme da irgendwie nciht weiter...hat da jemand evtl. eine Lösung?[/code]

Anzeige von ABAKUS

von Anzeige von ABAKUS »


Hochwertiger Linkaufbau bei ABAKUS:
  • Google-konformer Linkaufbau
  • nachhaltiges Ranking
  • Linkbuilding Angebote zu fairen Preisen
  • internationale Backlinks
Wir bieten Beratung und Umsetzung.
Jetzt anfragen: 0511 / 300325-0

haha
PostRank 9
PostRank 9
Beiträge: 1065
Registriert: 03.04.2006, 18:08
Wohnort: Bi Hamborg

Beitrag von haha » 30.05.2006, 13:53

sanchez hat geschrieben:

Code: Alles auswählen

/module/paramaterA_1/ParameterB_2/.../datei.html
dass per mod rewrite diese Seite aufgerufen wird:

Code: Alles auswählen

/index.php?parameterA=1&parameterB=2
die Anzahl der Parameter ist dabei beliebig (also auch die Ordner verschachtelung)...
Das geht so nicht, da mod_rewrite bzw. PCRE maximal neun Variablen bestücken kann ($1 bis $9). Obendrein muss im Muster pro Parameterblock ("paramaterA_1/") eine zusätzliche Klammer zur Abgrenzung eingesetzt werden, so dass die maximale Anzahl an Parameterblöcken auf drei sinkt (neun Klammern insgesamt, je Block eine Klammer für Name, Wert und Abgrenzung, macht 9 : 3 = 3).

Das Muster dafür sähe so aus: ^module/(([a-zA-Z0-9]+)_([a-zA-Z0-9%]+)/)(([a-zA-Z0-9]+)_([a-zA-Z0-9%]+)/)?(([a-zA-Z0-9]+)_([a-zA-Z0-9%]+)/)?datei\.html$
Die URL-Schablone dafür wäre folgende: index.php?$2=$3&$5=$6&$8=$9

Müssen es unbedingt mehr als drei Blöcke sein, bleibt Dir nichts anderes übrig, als die komplette Verarbeitung in das Skript zu verlegen. Versuche dabei nicht, noch per mod_rewrite irgendwelche Vorarbeiten zu erledigen; das bringt nichts außer einem Durcheinander, weil die Verarbeitung an zwei getrennten Orten erfolgt. Die Zeile

RewriteRule ^module/([a-zA-Z0-9]+_[a-zA-Z0-9%]+/)+datei\.html$ index.php?pfad=$1

reicht vollkommen.

Nebenbei: Wofür brauchst Du überhaupt das datei.html am Ende, wenn Du es doch sowieso nicht weitergibst? So wie im Bespiel ist das unnötiger Ballast.

Und noch was:
RewriteRule ^module\/(.*?)_(.*?)\/.*?.html$ index.php?$1=$2
- Benutze niemals .*, wenn es sich nicht irgendwie vermeiden lässt. .* schlürft alles weg, was im Weg steht. Anhand Deines Musters ließe sich ein Pfad auch so aufteilen: module/parameterA_1/parameterB_2/parameterC_3/datei.html. Oder so (theoretisch): module/parameterA_1/parameterB_2/parameterC_3/datei.html. Oder so (auch nur theoretisch): module/parameterA_1/parameterB_2/parameterC_3/datei.xyzhtml.

- Wenn im Text ein Punkt stehen soll, dann lass da auch einen Punkt stehen ("\.") und nicht ein beliebiges Zeichen ("."). Siehe das kleine z im letzten Beispiel oben.

- Benutze * nur, wenn Du an der Stelle definitiv auch die Möglichkeit vorsehen willst, dass da nichts steht. In einem Großteil der Fälle, wo ein * benutzt wird, ist eigentlich + gemeint.

- .*? macht keinen Sinn (wenn's überhaupt akzeptiert wird); .* kann auch ganz alleine Nichts bedeuten, dazu muss nicht noch ein Fragezeichen hinterher.

r2d2
PostRank 4
PostRank 4
Beiträge: 150
Registriert: 19.03.2004, 23:45

Beitrag von r2d2 » 30.05.2006, 15:00

du kannst auch alle möglichkeiten aufzählen:
RewriteRule ^(.*).php/(.*)_(.*)/(.*)_(.*)/(.*)_(.*)/(.*)_(.*)$ /$1.php?$2=$3&$4=$5&$6=$7&$8=$9 [L]
RewriteRule ^(.*).php/(.*)_(.*)/(.*)_(.*)/(.*)_(.*)$ /$1.php?$2=$3&$4=$5&$6=$7 [L]
RewriteRule ^(.*).php/(.*)_(.*)/(.*)_(.*)$ /$1.php?$2=$3&$4=$5 [L]
RewriteRule ^(.*).php/(.*)_(.*)$ /$1.php?$2=$3 [L]
r2d2

Anzeige von ABAKUS

von Anzeige von ABAKUS »

SEO Consulting bei ABAKUS Internet Marketing
Erfahrung seit 2002
  • persönliche Betreuung
  • individuelle Beratung
  • kompetente Umsetzung

Jetzt anfragen: 0511 / 300325-0.


sanchez
PostRank 1
PostRank 1
Beiträge: 10
Registriert: 21.04.2006, 08:31

Beitrag von sanchez » 30.05.2006, 17:51

ok,ok...ihr habt mich überredet.

ich hab halt folgendes vor: ich gehe mit einem script alle meine Links durch und mache aus ihnen einen suchmaschinen freundlichen Pfad und der soll dann in der .htaccess wieder in die richitge Datei umgewandelt werden. Wie der Suchmaschinen freundliche Pfad aussieht ist mir eigentlich egal...

es gibt also keine Möglichkeit belibig viele Parameter (denn ich weiß ja bevor mein Script drüber läuft nicht genau wie der link aussieht) irgendwie umzuwandeln? gibt es evtl. ein möglichkeit zu sagen suche ALLE Muster die "so und so" ausssehen und füge sie nach und nach wieder an die Zieladresse an? (so eine Art Schleife)
Sorry wenn ich ein wenig viel Frage, aber sonderlich gut kenne ich mich mit mod rewrite noch nicht aus...

haha
PostRank 9
PostRank 9
Beiträge: 1065
Registriert: 03.04.2006, 18:08
Wohnort: Bi Hamborg

Beitrag von haha » 30.05.2006, 20:16

sanchez hat geschrieben:(so eine Art Schleife)
Bei "Schleife" hat's geklingelt :) Es gibt in der Tat die Möglichkeit, mit dem N-Parameter alle Regeln nochmal von vorne durchlaufen zu lassen. Damit bekommst Du dann wider Erwarten tatsächlich das, was Du haben wolltest:

RewriteEngine on
RewriteBase /
RewriteRule ^module/(.+/)?([a-zA-Z0-9]+)_([a-zA-Z0-9%]+)/([a-z]+\.html)$ module/$1$4?$2=$3 [QSA,N,L]
RewriteRule ^module/[a-z]+\.html$ index.php

Die erste RewriteRule-Zeile trennt den jeweils letzten x_y-Block aus dem Pfad und hängt ihn als URL-Parameter an die Rest-URL an. Dieser Schritt wird in einer Schleife ausgeführt: Aus "module/a_1/b_2/bla.html" wird "module/a_1/bla.html?b=2", dann geht's in die Schleife und es entsteht "module/bla.html?a=1&b=2".

URL-Parameter werden von mod_rewrite grundsätzlich erstmal abgetrennt (weshalb sie auch nur mit RewriteCond abzufragen sind), QSA sorgt dafür, dass sie an die neue URL wieder angehängt werden. Dieser Vorgang ist auch der Grund dafür, dass wir die Blöcke zwar von hinten aufrollen, sie aber trotzdem als URL-Parameter in der richtigen Reihenfolge erscheinen.

N sorgt wie schon angedeutet dafür, dass der Prozess mit der neuen URL von vorne beginnt.

Das L ist nötig, weil einige mod_rewrite-Versionen die neue URL fehlerhaft zusammensetzen. Die neue URL ist dann nicht nur unbrauchbar, wegen dem N landet man in diesem Fall auch noch in einer Endlosschleife.

Die zweite RewriteRule-Zeile sorgt dafür, dass ganz zum Schluss, wenn alle x_y-Blöcke in URL-Parameter angehängt wurden ("module/bla.html?a=1&b=2&c=3"), index.php aufgerufen wird.

sanchez
PostRank 1
PostRank 1
Beiträge: 10
Registriert: 21.04.2006, 08:31

Beitrag von sanchez » 31.05.2006, 14:31

na das nenne ich mal eine ausführliche und kompetente Antwort...erstmal danke dafür, werd eas gleich mla ausprobieren...

Caterham
PostRank 5
PostRank 5
Beiträge: 329
Registriert: 20.09.2004, 19:12

Beitrag von Caterham » 01.06.2006, 11:21

Das L ist nötig,
Das N ist dann aber überflüssig, wenn du über L abbrichst. Das schließt sich gegenseitig aus. Dann wird nämlich gerade nicht neu gestartet, sondern es kommt zum internal redirect, d.h. der Request wandert erneut auf die uri ebene und durchläuft viele Module/Teile wie ein neuer, separater Request. Damit generierst du abh. von der Parameteranzahl zig internal redirects, performanceoptimal ist das nicht. Sinnvoller ist es daher, das Verzeichnis module anzulegen und dann das L-Flag zu entfernen.

Warum vorliegend der String jedoch nicht einfach in PHP gesplittet wird, kann ich nicht so ganz nachvollziehen...
weil einige mod_rewrite-Versionen
Der per-dir context bei vorhandenem path_info, versionsunabhängig.
.*? macht keinen Sinn
Das ist eine non-greedy RegEx, das Gegenteil von .* - greedy.

Antworten
  • Vergleichbare Themen
    Antworten
    Zugriffe
    Letzter Beitrag