mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler

Diskutiere mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler im Web & Grafik Forum im Bereich Internet & Telekomunikation Forum; Hallo liebe Foren-Freunde, ich habe folgendes Problem: Ich habe eine URL die folgendermaßen ausschaut...
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #1
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Hallo liebe Foren-Freunde,

ich habe folgendes Problem:

Ich habe eine URL die folgendermaßen ausschaut:
Code:
http://www.domain.com/abc/dbbezeichnung/index.php
die URL soll so rewritten werden, dass im Endeffekt folgendes requestet wird:
Code:
http://www.domain.com/abc/index.php?dbname=dbbezeichnung
Also, dbbezeichnung soll praktisch aus der URL geschnitten werden, und als get-Parameter an alles was danach kommt, angehängt werden.

Weitere Beispiele zwecks Klarheit:
Code:
http://www.domain.com/abc/dbbezeichnung/admin/admin.php
http://www.domain.com/abc/admin/admin.php?dbname=dbbezeichnung

http://www.domain.com/abc/dbbezeichnung/admin/unterordner/foo.php
http://www.domain.com/abc/admin/unterordner/foo.php?dbname=dbbezeichnung

http://www.domain.com/abc/dbbezeichnung/
http://www.domain.com/abc/?dbname=dbbezeichnung
dbbezeichnung ist natürlich variabel, und kann einmal dies, einmal das sein.
abc in der URL sind fix - d.h. dort steht dann immer abc.


Mein Ansatz war etwas wie
Code:
RewriteRule ^(.*)/abc/(.*)/(.*)$ $1/abc/$3?dbname=$2
leider komme ich damit nicht weiter.

Ich hoffe sehr, dass ihr mir da weiterhelfen könnt, zumal ich auch noch etwas Termindruck für die Lösung habe.

Vielen Dank für eure Unterstützung,
lg,
Whiskey
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #2
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Ohne mich groß auszukennen, nur kurz eine logische Sache.

Code:
RewriteRule ^(.*)/abc/(.*)/(.*)$ $1/abc/$3?dbname=$2
--> hier fehlt die Dateiendung
Code:
RewriteRule ^(.*)/abc/(.*)/(.*)$ $1/abc/$3.php?dbname=$2
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #3
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Ohne mich groß auszukennen, nur kurz eine logische Sache.

Code:
RewriteRule ^(.*)/abc/(.*)/(.*)$ $1/abc/$3?dbname=$2
--> hier fehlt die Dateiendung
Code:
RewriteRule ^(.*)/abc/(.*)/(.*)$ $1/abc/$3.php?dbname=$2

Warum dieses? In $3 sollte ja eh alles nach dbname/ drin sein. Wozu noch ne Endung dazu:eek:hoh:
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #4
Lambo-Benni

Lambo-Benni

Bekanntes Mitglied
Dabei seit
23.03.2007
Beiträge
7.601
Reaktionspunkte
3
Ort
Medizinmanndiscount
Ach stimmt, sry. Hatt ich auf die Schnelle übersehen.
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #5
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Ach stimmt, sry. Hatt ich auf die Schnelle übersehen.
Danke trotzdem. :nicken:
Das schlimme ist, für mich scheint die Lösung so wie von mir erdacht einfach zu stimmen - aber es funzt nicht und ich komm einfach nicht drauf warum. Es erscheint mir nur so logisch, wie ich es schon versucht hab. :böse:
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #6
S

Stefan

Guest
Der * Operator ist immer greedy = gierig, also steht also im ersten Beispiel in $2 »dbbezeichnung/admin/unterordner« drin, nicht wie du es vielleicht erwartest nur »dbbezeichnung«. Du musst den Operator entsprechend ändern, dann nimmt der nur so wenig wie eben erforderlich (ungreedy) - ersetze also (.*) durch (.*?).

Ich würde aber noch weiter gehen und genauer beschreiben, was du willst: nämlich alle Buchstaben bis zum nächsten Slash - und nicht jedes beliebige Zeichen. Hier kommt also
  • \w (wordcharacter)
  • [^/] (alles außer ein Slash)
  • [a-z] (Buchstabe von a-z)
  • [a-z0-9] (Buchstabe von a-z oder Zahl von 0-9)
in Betracht.
Auch würde ich nicht * sondern + verwenden, denn du willst ja, dass da ein Datenbankname steht, oder?

Zum Abschluss noch ein paar Tipps:
  • Vermeide (insbesondere den mehrfachen) Einsatz von .* denn das gibt u.U. noch mehr Probleme. Wenns blöd läuft, hast du im aktuellen Fall den Datenbanknamen im ersten Match drin stehen, das willst du auch nicht (wieso hast du den da überhaupt stehen?)
  • Verwende zum Testen eine Regel, die dich weiterleitet (» [R=307]« ans Ende setzen), dann siehst du daran schon einmal, wohin er dich weiterleiten würde bzw. was er aufrufen will. Dazu http://web-sniffer.net/ verwenden, da siehst du das (ohne ausgeführte Weiterleitung und Browsercache) schön.
  • Verwende ein Regex-Tool, welches dir die ganzen Matches und eventuelle Syntaxfehler gleich anzeigt. Als Windows-Software kenne ich The Regex Coach, aber gibt da auch noch mehrere und tlw. onlinebasierte. Such da im Netz einfach mal danach, ich kenne (und nutze) leider nur http://rubular.com/, der ist aber auf Ruby und dessen Möglichkeiten ausgelegt...

Freundliche Grüße

Stefan
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #7
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Danke auch dir, Stefan!

Leider habe ich deinen Post zu spät entdeckt, mittlerweile bin ich aber soweit, dass es grundsätzlich klappt.

Code:
RewriteCond %{REQUEST_URI} !.*abc/admin/.*
RewriteCond %{QUERY_STRING} !.*dbname=.*
RewriteRule ^mtk/([^/.]*)/?(.*)$ abc/$2?dbname=$1 [L,NC,QSA]

Morgen wird noch intensiv getestet und überlegt ob noch was nicht bedacht ist, bzw. auch das mit den .* werde ich mir nochmal anschauen.

Für Tips&Meinungen zum derzeitigen Stand wäre ich sehr dankbar!
Und nun bin ich müde, und froh dass es mal so geht.

glG und gute Nacht,
Whiskey
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #8
S

Stefan

Guest
Hallo Whiskey,

wenn du hier fragst, dann solltest du das Thema im Auge behalten - es besteht die Gefahr, dass hier dann auch wer drauf antwortet ;)

Mal ohne groß zu testen hier die Punkte, die mir bei der aktuellen Lösung auffallen:
  • Du kannst dir jeweils das ».*« in Zeile 1 und 2 sparen, soweit ich weiß wird geschaut, ob der Regex auf den String passt, und das tut er ja trotzdem noch.
  • In Zeile 3 musst du mtk durch abc ersetzen, sonst passt das nicht mehr auf obige Beispiele
  • ([^/.]*) würde ich immer noch durch ([^/.]+) ersetzen
 
  • mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler Beitrag #9
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Hallo Whiskey,

wenn du hier fragst, dann solltest du das Thema im Auge behalten - es besteht die Gefahr, dass hier dann auch wer drauf antwortet ;)

Mal ohne groß zu testen hier die Punkte, die mir bei der aktuellen Lösung auffallen:
  • Du kannst dir jeweils das ».*« in Zeile 1 und 2 sparen, soweit ich weiß wird geschaut, ob der Regex auf den String passt, und das tut er ja trotzdem noch.
  • In Zeile 3 musst du mtk durch abc ersetzen, sonst passt das nicht mehr auf obige Beispiele
  • ([^/.]*) würde ich immer noch durch ([^/.]+) ersetzen

:kichern: Ja, bei dem Thema hätte ich nicht gedacht in so kurzer Zeit Antworten - noch dazu qualifizierte - zu erhalten. Schön zu sehen, dass das so gut klappt.

Das mit dem mtk ist ein copy&paste Fehler - im Original ist es nicht abc sondern das Kürzel mtk. Paranoider-Weise, habe ich abc verwendet um das Beispiel zu Obfuscieren :gähnen:

Tipp 1&3 werde ich noch testen, danke auch dafür.
So an sich bin ich ganz zufrieden mit dem Ergebnis, zumal ich zuvor mod_rewrite nur rudimentär bei diversen Anpassungen gesehen/gebraucht habe.
 
Thema:

mod_rewrite RewriteRule - URL1->URL2 - wo ist mein (Denk)Fehler

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.180
Beiträge
1.579.173
Mitglieder
55.879
Neuestes Mitglied
stonetreck
Oben