Keine Dateiendungen verwenden (mod rewrite)
Andreas
- webserver
0 Sven Rautenberg0 Andreas
0 Andreas
Hallo!
Wir hatten das ja mal kürzlich diskutiert, und da habe ich mir überlegt bei nem neuen Projekt das mal zu versuchen, halt keine Dateiendungen mehr. Aber wie muß das in der .htaccess genau aussehen?
RewriteEngine On
RewriteBase /
RewriteRule ^(.*?) /.php [L]
Da hätte ich dann noch .php Dateien im Hintergrund, wobei ich da probleme mit Parametern in der URL bekomme.
Wie macht Ihr das denn? Mir kommt das alles sehr unsicher vor!
Grüße
Andreas
Moin!
Wir hatten das ja mal kürzlich diskutiert, und da habe ich mir überlegt bei nem neuen Projekt das mal zu versuchen, halt keine Dateiendungen mehr. Aber wie muß das in der .htaccess genau aussehen?
RewriteEngine On
RewriteBase /
RewriteRule ^(.*?) /.php [L]
Da hätte ich dann noch .php Dateien im Hintergrund, wobei ich da probleme mit Parametern in der URL bekomme.
Wie macht Ihr das denn? Mir kommt das alles sehr unsicher vor!
Du benutzt einfach ContentNegitiation durch Multiviews.
http://httpd.apache.org/docs/content-negotiation.html
Das passiert praktisch automatisch, und du mußt nicht mit einer Rewrite-Rule eingreifen.
- Sven Rautenberg
Hi Sven!
Du benutzt einfach ContentNegitiation durch Multiviews.
Das passiert praktisch automatisch, und du mußt nicht mit einer Rewrite-Rule eingreifen.
Danke Dir! Aber leider kann ich unter angegeben Link nicht wirklich erkennen was ich jetz genau machen soll. Ich weiß jetzt wie es funktioniert, aber was muß denn dafür in die .htaccess?
Grüße
Andreas
Moin!
Du benutzt einfach ContentNegitiation durch Multiviews.
Das passiert praktisch automatisch, und du mußt nicht mit einer Rewrite-Rule eingreifen.
Danke Dir! Aber leider kann ich unter angegeben Link nicht wirklich erkennen was ich jetz genau machen soll. Ich weiß jetzt wie es funktioniert, aber was muß denn dafür in die .htaccess?
Du mußt das MultiViews aktivieren. Das gibts unter der Option "Options". http://httpd.apache.org/docs/mod/core.html#options
- Sven Rautenberg
Hi Sven!
Du mußt das MultiViews aktivieren. Das gibts unter der Option "Options". http://httpd.apache.org/docs/mod/core.html#options
Danke Dir! Das ist ja noch einfacher als ich dachte!
Options +MultiViews
so funktioniert es bestens. Kannst Du aus Deiner Erfahrung sagen das Links ohne Endung aber mit Parametern sowohl gängige Browser als auch gängige Email-Clients vor keine Probleme stellen? Bei mir jedenfalls läuft es Prima.
Aber 2 Frage hätte ich da noch, wie ist das, wenn ich eine .pl und eine .php Datei im Ordner habe, wie kann ich bestimmen welche davon gewählt wird?
Und 2. Wie kann ich es schaffen das auf alle .php und .pl Dateien ein 404-Fehler ausgegeben wird, obwohl die Datei ja vorhanden ist! Ich würde es gerne haben, das nur noch die Requests ohne Endungen verwendet werden!
Bräuchte ich da wieder eine Rewrite Rule? Also was der Art
RewriteRule ^(.*?).php?? [R=404,L]
RewriteRule ^(.*?).pl?? [R=404,L]
(.*?) verwende ich damit alles bis zum ersten Vorkommen des ? finde. Hat was mit greedy... zu tun.
Grüße
Andreas
Hallo nochmal!
Ich habe mal ein paar Varianten probiert, aber bekomme immer einen 500er Fehler:
.htaccess: RewriteRule: cannot compile regular expression '^(.*?)??(.*?)$'
ich habe auch probiert:
^(.*?)[?]?(.*?)$
^(.*?)?(.*?)$
^(.*?)$
immer 500er, wieso?
so hatte ich es mir gedacht:
RewriteRule ^(.*?)??(.*?)$ /$1.php?$2 [R=301,L]
Jemand ne Idee?
Grüße
Andreas
Moin!
^(.*?)[?]?(.*?)$
^(.*?)?(.*?)$
^(.*?)$
immer 500er, wieso?
Immer verwendest du .*? - wieso? Das matcht unter Umständen auf den Leerstring - wäre nicht so gut. Ok, du hast deinen String zwischen ^ und $ eingebunden, irgendwas wird irgendwas finden. Aber warum dann nicht mit .* vorgehen?
so hatte ich es mir gedacht:
RewriteRule ^(.*?)??(.*?)$ /$1.php?$2 [R=301,L]
Ganz schlechte Idee, vor allem das R=301. Damit erzeugst du einen Redirect, das bedeutet: Der Browser muß den Server _nochmal_ nach der Seite fragen, und zweitens taucht die neue URL in der URL-Zeile auf und wird so dann vermutlich auch in Suchmaschinen gespeichert. Das konterkariert doch das ganze System. Sinn ist es, die internen URLs geheim zu halten, und die öffentlichen URLs sinnvoll umzusetzen.
Warum da Fehler 500 kommt, seh' ich auf den ersten Blick auch nicht - aber das ist ja eh' der umständlichere Ansatz, also lassen wir's lieber erstmal. :)
- Sven Rautenberg