Baba: mod_rewrite - entfernen des Strings "index.php" aus url

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

  1. 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

    1. 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

      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']

      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

      delete "index.php/" from url

      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:

      clip "index.php/" from url

      #RewriteCond %{REQUEST_URI} ^(.*)+(index.php)+(.*)$
      #RewriteRule (.*) %3 [R=301,L]

      RewriteEngine on

      redirect to index.php if file does not exist

      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

      1. 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