mod_rewrite - entfernen des Strings "index.php" aus url
Baba
- webserver
Hallo, es ist nicht ganz leicht, im MOD_REWRITE Chaos durchzusehen...
Bitte um Hilfe in dieser Sache.
Folgende htaccess Datei verwende ich:
___________________________________________________________
RewriteEngine on
RewriteBase /
# delete last slash and reload
RewriteRule (.*[^/])/$ /$1 [L,R=301]
# link to index.php if file does not exist
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [QSA] #$_SERVER['PATH_INFO']
___________________________________________________________
@ # delete last slash and reload
Dies, habe ich mal gelesen, soll gut sein gegen doppelten Content
@ # link to index.php if file does not exist
Also der Sinn dahinter ist, dass ich alle Anfragen, die ins Leere führen auf die index.php lenke, und das aufgerufene Script hinten dranhänge, als Parameter. Dieser Parameter wird mittels $_SERVER["PATH_INFO"] vom index.php ausgewertet. Dies habe ich aus einem Blog.
So führt
http://localhost/matlab2 (bleibt in der Adressleiste stehen)
zu
http://localhost/index.php/matlab2
Ob diese Datei existiert, wird aus einer Datenbank abgefragt. Im Fehlerfall wird eine eigene 404 Seite includet.
Nebenbei: alle Pages gehen über die index.php. Im öffentlichen Verzeichnis befindet sich keine andere php Datei.
Jetzt ist es aber so, dass ja ein Nutzer auch
http://localhost/index.php/matlab2
eingeben kann. Und das bleibt in der Adressleiste stehen. Das wäre dann wieder doppelter Content :(
Ich benötige eine Regel, die mir immer /index.php aus dem String entfernt. Ich weiß nicht, wie ich zu der Lösung kommen soll. Normalerweise hangelt man sich ja so vorwärts. Aber ich kann mir ja nicht ausgeben lassen, was die RewriteCond gerade so alles denkt...
Ist irgendwas in dieser Art sinnvoll:
RewriteCond %{REQUEST_FILENAME} ^(.*)index.php(.*)$ [NC]
RewriteRule %1%2 [R=301,L]
?
Für jede Hilfe bin ich dankbar.
Cheers,
Baba
hi,
Jetzt ist es aber so, dass ja ein Nutzer auch
http://localhost/index.php/matlab2
eingeben kann. Und das bleibt in der Adressleiste stehen. Das wäre dann wieder doppelter Content :(
Wenn das so ist, tut Dein index.php nicht so wie es soll: Es soll den REQUEST_URI (bzw. PATH_INFO) auswerten und daran entscheiden, ob der Request einer Response würdig ist. Ansonsten sollte es mit Status: 404 Not Found antworten. Das sollte es auch machen, wenn es selbst als URI requestet wurde. Ergo:
ErrorDocument 404 index.php
fertig;
Hotti
hi,
Jetzt ist es aber so, dass ja ein Nutzer auch
http://localhost/index.php/matlab2
eingeben kann. Und das bleibt in der Adressleiste stehen. Das wäre dann wieder doppelter Content :(Wenn das so ist, tut Dein index.php nicht so wie es soll:
Doch, es gibt die index.php/matlab2 ja.
Vielleicht nochmal etwas deutlicher.
Alle meine Pages gehen über die index.php. Bsp:
index.php/matlab
index.php/matlab2
index.php/user/login
einzig, ich möchte das index.php nicht in der URL haben.
Daher funktioniert es mit
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [QSA] #$_SERVER['PATH_INFO']
dass ich alle Requests auf
/matlab
/matlab2
/user/login
auf die entsprechende index.php umleite. Schalter QSA!!
Nun möchte ich zusätzlich index.php aus der URL eliminieren, wenn es denn doch eingeben wurde. Mit
RewriteCond %{REQUEST_URI} ^(.*)+(index.php)+(.*)$
RewriteRule (.*) %3 [R=301,L]
klappt das, allerdings widersprechen sich die Regeln und es kommt zur Endlosschleife. Ich dachte, ich könnte mit dem Schalter [L] an der ersten Bedingung lösen:
#RewriteCond %{REQUEST_URI} ^(.*)+(index.php)+(.*)$
#RewriteRule (.*) %3 [R=301,L]
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) /index.php/$1 [QSA,L] #$_SERVER['PATH_INFO']
, allerdings steht geschrieben....
'last|L' (last rule)
Stop the rewriting process here and don't apply any more rewrite rules. This corresponds to the Perl last command or the break command in C. Use this flag to prevent the currently rewritten URL from being rewritten further by following rules. Remember, however, that if the RewriteRule generates an internal redirect (which frequently occurs when rewriting in a per-directory context), this will reinject the request and will cause processing to be repeated starting from the first RewriteRule.
Was mache ich da???
"this will reinject the request and will cause
processing _to be repeated starting from the first RewriteRule_"
Bitte helft mir!
Cheers,
Baba
hi,
Jetzt ist es aber so, dass ja ein Nutzer auch
http://localhost/index.php/matlab2
eingeben kann. Und das bleibt in der Adressleiste stehen. Das wäre dann wieder doppelter Content :(Wenn das so ist, tut Dein index.php nicht so wie es soll:
Doch, es gibt die index.php/matlab2 ja.
Mit den entsprechenden Conditions sollte eine Regel reichen
RewriteRule ^ /index.php [L]
Erstelle eine Tabelle, die alle erlaubten URLs enthält (ohne QS). /index.php darf nicht in der Tabelle enthalten sein, also etwa so
/
/foo
/bar/
/foo/bar
index.php prüft anhand der Tabelle und wenn dann jemand ein /index.php/y/x requestet, sollte index.php einen Status: 404 Not Found ausgeben. Ein Request
/foo/bar?x=y
wäre erlaubt, x=y bekommst Du auch ohne [QSA] (weil in o.g. Regel index.php selbst keine Parameter hat, wo die anderen angehängt werden müssten).
Was ist daran so schwierig?
Hotti