RewriteRule - Letztes Zeichen fehlt

Alles, was den Apache betrifft, kann hier besprochen werden.

RewriteRule - Letztes Zeichen fehlt

Postby Shy Guy » 11. August 2010 17:36

Ich habe ein paar mod_rewrite-Direktiven in einer .htaccess-Datei geschrieben:
Code: Select all
RewriteEngine On
RewriteRule ^(.*)[^(\.php)]$ /verzeichnis/$1.php [R]

Diese .htaccess-Datei befindet sich in /verzeichnis. Sie soll, wenn ich beispielsweise "/verzeichnis/test" eingebe die Datei "/verzeichnis/test.php" aufrufen, und diese Datei existiert.
Es kommt aber eine Fehlermeldung "Object nicht gefunden!". Da ich zum Testen noch [R] angegeben habe sehe ich, dass der Server mich nicht nach "test.php" bringt, sondern nach "tes.php". Er verliert also immer das letzte Zeichen :(
Kann mir da jemand helfen?
Shy Guy
 
Posts: 14
Joined: 12. May 2010 13:51
Location: Bocholt, Nordrhein-Westfalen
Operating System: Windows Vista (32 bit)

Re: RewriteRule - Letztes Zeichen fehlt

Postby Nobbie » 11. August 2010 18:41

Shy Guy wrote:Kann mir da jemand helfen?


Joo, begründe doch mal dieses wirre Pattern:

Code: Select all
[^(\.php)]


Es ist schon fast ein Wunder, dass überhaupt irgendwas passiert. Es ist syntaktisch eben nicht falsch, aber semantisch mit absoluter Sicherheit nicht das, was Du willst.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: RewriteRule - Letztes Zeichen fehlt

Postby Shy Guy » 11. August 2010 19:28

Nobbie wrote:
Shy Guy wrote:Kann mir da jemand helfen?


Joo, begründe doch mal dieses wirre Pattern:

Code: Select all
[^(\.php)]


Es ist schon fast ein Wunder, dass überhaupt irgendwas passiert. Es ist syntaktisch eben nicht falsch, aber semantisch mit absoluter Sicherheit nicht das, was Du willst.

Vermutlich ist es falsch. Es soll überprüfen ob in der Uri schon ".php" steht. Somit soll also z.B. "test" zwar zu "test.php" weitergeleitet werden, "test.php" hingegen aber nicht zu "test.php.php".
Shy Guy
 
Posts: 14
Joined: 12. May 2010 13:51
Location: Bocholt, Nordrhein-Westfalen
Operating System: Windows Vista (32 bit)

Re: RewriteRule - Letztes Zeichen fehlt

Postby Nobbie » 11. August 2010 21:50

Shy Guy wrote:Vermutlich ist es falsch.


Sehr sogar.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Die Lösung (?)

Postby Shy Guy » 11. August 2010 22:47

Nobbie wrote:
Shy Guy wrote:Vermutlich ist es falsch.


Sehr sogar.

Ich glaube, die "richtige" Lösung sollte folgende sein (habe romprobiert):
Code: Select all
RewriteRule ^(.+[^(\.php)])$ $1.php

Dies sollte alles, was ich in der Adresszeile eingebe (wenn überhaupt etwas nach dem Server-Namen), z.B. "home" zu "home.php" umleiten, "dir/test" zu "dir/test.php" umleiten etc., jedoch nicht "home.php" zu "home.php.php" umleiten.

Falls doch irgendwas in der .htaccess-Datei falsch oder "unsinnvoll" ist oder so, bitte sagen.
Shy Guy
 
Posts: 14
Joined: 12. May 2010 13:51
Location: Bocholt, Nordrhein-Westfalen
Operating System: Windows Vista (32 bit)

Re: Die Lösung (?)

Postby Nobbie » 12. August 2010 11:28

Shy Guy wrote:Ich glaube, die "richtige" Lösung sollte folgende sein (habe romprobiert):
Code: Select all
RewriteRule ^(.+[^(\.php)])$ $1.php

Dies sollte alles, was ich in der Adresszeile eingebe (wenn überhaupt etwas nach dem Server-Namen), z.B. "home" zu "home.php" umleiten, "dir/test" zu "dir/test.php" umleiten etc., jedoch nicht "home.php" zu "home.php.php" umleiten.

Falls doch irgendwas in der .htaccess-Datei falsch oder "unsinnvoll" ist oder so, bitte sagen.


Lies Dir die Regular Expressions noch mal durch, das Pattern ist grausam und tut nur anscheinend in etwa das, was Du willst. Gib doch mal "dir/mach" oder auch nur "pepp" als Test ein...
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04

Re: Die Lösung (?)

Postby Shy Guy » 12. August 2010 14:50

Nobbie wrote:Lies Dir die Regular Expressions noch mal durch, das Pattern ist grausam und tut nur anscheinend in etwa das, was Du willst. Gib doch mal "dir/mach" oder auch nur "pepp" als Test ein...

Ich verstehe schon... :( Aber bei den Regular Expressions finde ich nicht heraus, wie ich eine Zeichenfolge "negieren" kann, sprich, dass z.B. die Zeichenfolge ".php" nicht am Ende der URL steht.
Da muss es doch was geben, oder? Oder muss ich evtl. RewriteCond benutzen?
Shy Guy
 
Posts: 14
Joined: 12. May 2010 13:51
Location: Bocholt, Nordrhein-Westfalen
Operating System: Windows Vista (32 bit)

Re: Die Lösung (?)

Postby Nobbie » 12. August 2010 15:44

Shy Guy wrote:Ich verstehe schon... :( Aber bei den Regular Expressions finde ich nicht heraus, wie ich eine Zeichenfolge "negieren" kann, sprich, dass z.B. die Zeichenfolge ".php" nicht am Ende der URL steht.


Genau das ist eine bekannte Schwachstelle der Regular Expressions. In Script Sprachen wie PHP beispielsweise umgeht man dieses Problem manchmal damit, dass man eben eine Zeichenkette sucht und bei "Nichttreffern" eine Aktion veranlasst.

Shy Guy wrote:Oder muss ich evtl. RewriteCond benutzen?


Das wäre eine Möglichkeit. Oder man nutzt eben aus (und das ist u.a. die Usache, warum Dein Pattern überhaupt manchmal funktioniert), dass eine RewriteRule nur ausgeführt wird, wenn das Pattern trifft (damit ist ja implizit eine Condition mitgegeben). Die einfachste Lösung, die mir einfällt, setzt aber voraus, dass Ordner keinen Punkt "." im Namen haben dürfen (was natürlich von Dir selbst kontrolliert wird), aber durchaus eine vertretbare Anforderung ist:

Code: Select all
RewriteRule [^\.]* $0.php


Noch effektiver und schlichter geht nicht. Wozu der ganze Aufwand dient, ist mir allerdings schleierhaft, insbesondere wo ja auch x-fach andere Fälle nicht festgelegt sind (was passiert bei "test.abc", was passiert bei "test.ph"? usw.).
Last edited by Nobbie on 12. August 2010 15:51, edited 2 times in total.
Nobbie
 
Posts: 13170
Joined: 09. March 2008 13:04


Return to Apache

Who is online

Users browsing this forum: No registered users and 32 guests