Laden...

[gelöst] Apache .htaccess RewriteRule Pattern Matching Problem

Erstellt von Matthias Lauth vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.112 Views
Matthias Lauth Themenstarter:in
48 Beiträge seit 2010
vor 12 Jahren
[gelöst] Apache .htaccess RewriteRule Pattern Matching Problem

Hallo Zusammen,

ich benötige einmal Hilfe. Ich möchte in einer .htaccess folgenden String finden:


web1.example.com/index/

Das bekomme ich mit dieser Regel hin:

RewriteRule ^(.*)/(.*)/$

Den Slash am Ende will ich optional machen, so das man das gleiche auch unter dieser Adresse finden kann:

web1.example.com/index

Und das funktioniert nicht...

Idee 1:


^(.*)/(.*)(/?)$
^(.*)/(.*)/?$

funktioniert nicht.

Idee 2:

^(.*)/(.*)(/{0,1})$

auch nicht

Idee 3: (jetzt wird es verzweifelt)

^(.*)/(.*)(/|)$

Und jetzt habe ich keine mehr deswegen meine Frage kennt jemand die Lösung? (Nein ich will nicht prinzipiell an jede URL einen abschließenden Slash kleben. Ja ich muss die .htaccess benutzen) Die Frage passt nicht so ganz in dieses Forum, aber auch nicht in die .NET Basis Technologie Abteilung aber alles in meinem Körper schreit nein, wenn ich daran denke mich in einem PHP Forum anzumelden.

Vielen lieben Dank,
Matthias

C
2.122 Beiträge seit 2010
vor 12 Jahren

Ist / nicht ein Sonderzeichen das man escapen müsste?

D
216 Beiträge seit 2009
vor 12 Jahren

Nö, / ist kein Sonderzeichen. Das Problem ist, dass der reguläre Ausdruck nicht auf web1.example.com/index/ losgelassen wird, sondern nur auf das index/ (ohne sub-, haupt- und Topleveldomain, und ohne den / nach der TLD (und auch ohne Querystring)). Deshalb müsste das ganze so heißen:

RewriteRule ^(.*)/?$

Dabei steht dann in $1 "index".

Ich würde an deiner Stelle auch noch mit einer RewriteCond noch alle Aufrufe in css, js, ... Ordner nicht auch umleiten, dass kann sonst zu Problemen führen wenn web1.example.com/css/style.css auch umgeleitet wird.

RewriteCond %{REQUEST_URI} !^/?(css|js|images)/

Damit werden alle Aufrufe die in die Ordner css, js oder images gehen nicht von der nachfolgenden RewriteRule umgeschrieben.

Darth Maim

Matthias Lauth Themenstarter:in
48 Beiträge seit 2010
vor 12 Jahren

Danke für Deine Antwort. Hier mal das komplette File so wie es aktuell läuft.

RewriteEngine on

RewriteCond %{SERVER_NAME}  ^web1.example.de
RewriteRule ^(.*)/(.*)/$ $1\.php?RID=1&ID=$2 [L]

RewriteCond %{SERVER_NAME}  ^web1.example.de
RewriteRule ^(.*)/$ $1\.php?RID=1 [L]

Sobald ich das ? hinter den / setze bekomme ich einen 500er HTTP Error. (Die Datei ist definitiv ANSI Codiert.) Und ich bekomme es einfach nicht zum funktionieren.

D
216 Beiträge seit 2009
vor 12 Jahren

Das liegt wohl an der Endlos-Rekursion die dadurch entsteht

[pre]web1.example.com/index         => web1.example.com/index.php
web1.example.com/index.php     => web1.example.com/index.php.php
web1.example.com/index.php.php => web1.example.com/index.php.php.php
...[/pre]

Mit der zusätzlichen Condition das nicht ".php" in der Request URI steht, passiert dir das nicht mehr:

RewriteCond %{REQUEST_URI} !\.php

Zumindest bei mir auf dem Server funktioniert deine .htaccess dann 😃

Darth Maim

Edit: Warum die Endlosrekursion nicht stattfindet wenn du / hinten dran hast ist dann ja logisch, da "web1.example.com/index/" nach "web1.example.com/index.php" weiterleitet, und das ja nicht mit / endet 😃

Matthias Lauth Themenstarter:in
48 Beiträge seit 2010
vor 12 Jahren

Danke das funktioniert. Aber ich hatte gedacht, dass mein [L] Flag verhindert das da irgendetwas mehrfach ausgeführt wird. Wieso ist das nicht der Fall?