JOhn: mod_rewrite Problem

Hallo.

Mein Server(Debian) hat die Webfiles unter:
/var/www

Meine htaccess funktioniert aber irgendwie nicht.
Unter localhost funktionierts mit:
RewriteEngine On
AddCharset utf-8 .css .html .php .js
AddDefaultCharset utf-8
DirectoryIndex index.php
RewriteBase  /
ErrorDocument 404 /404-Fehler/
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6
RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6

Unter Debian funktioniert es weder so wie da oben noch so:
RewriteEngine On
AddCharset utf-8 .css .html .php .js
AddDefaultCharset utf-8
DirectoryIndex index.php
RewriteBase  /var/www/
ErrorDocument 404 /404-Fehler/
RewriteCond %{HTTP_HOST} ^www.(.+)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6
RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6

Woran liegt das?

  1. Achja, so sieht meine httpd.conf aus:

    DocumentRoot "/var/www"
    <Directory />
        Options FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
    </Directory>
    <Directory "/var/www">
        Options Indexes FollowSymLinks Includes ExecCGI
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    <FilesMatch "^.ht">
        Order allow,deny
        Deny from all
        Satisfy All
    </FilesMatch>

    Gruß, John

  2. Hallo John,

    Unter Debian funktioniert es weder so wie da oben noch so:

    RewriteBase  /var/www/

    Kommentiere die Zeile mal aus! Ansonsten ist auf den ersten Blick nichts auffälliges zu sehen. Daher solltest Du, wenn es daran nicht liegt, Dein Problem ausführlich erklären. Das schließt die Versionsnummern der Webserver, Error-Logs und eine Beschreibung, was im Browser sichtbar ist, ein.

    RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6
    RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6

    Noch etwas prinzipielles:

    PHP hat über die Variable $_SERVER['REQUEST_URI'] Zugriff auf den ursprünglich angefragten Pfad. Es ist die einfachste und portabelste Art, relevante Angaben aus dem Pfad vom PHP-Script selbst extrahieren zu lassen.

    Gruß aus Berlin!
    eddi

    1. Kommentiere die Zeile mal aus! Ansonsten ist auf den ersten Blick nichts auffälliges zu sehen. Daher solltest Du, wenn es daran nicht liegt, Dein Problem ausführlich erklären. Das schließt die Versionsnummern der Webserver, Error-Logs und eine Beschreibung, was im Browser sichtbar ist, ein.

      Apache HTTP Server Version 2.2
      PHP 5.2.11

      Im Browser wird nur die Startseite geladen und auch nur durch "/"
      sprich http://domain/
      gebe ich http://domain/index.php ein, wirft er nur ne  weiße Seite aus!

      RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6
      RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6

      Noch etwas prinzipielles:

      PHP hat über die Variable $_SERVER['REQUEST_URI'] Zugriff auf den ursprünglich angefragten Pfad. Es ist die einfachste und portabelste Art, relevante Angaben aus dem Pfad vom PHP-Script selbst extrahieren zu lassen.

      Genau das wird auch gemacht.
      Die Zeilen oben sorgen nur für ne schöne URL.
      Ausgewertet wird das ganze dann über REQUEST_URI .. explode.. "/"...

      Gruß, John

      1. Wenn ich: http://domain/foo/
        eingebe
        Aus dem Error-Log:

        [Thu Oct 22 23:08:18 2009] [error] [client 91.57.205.122] File does not exist: /var/www/foo, referer: http://domain/

      2. Re:

        Apache HTTP Server Version 2.2

        Das ist die Major Version; die ganze Version bitte!

        RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6
        RewriteRule ^([a-zA-Z0-9-]+)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?([a-zA-Z0-9-]*)/?$ index.php?p=$1&id=$2&a=$3&b=$4&c=$5&d=$6

        Noch etwas prinzipielles:

        PHP hat über die Variable $_SERVER['REQUEST_URI'] Zugriff auf den ursprünglich angefragten Pfad. Es ist die einfachste und portabelste Art, relevante Angaben aus dem Pfad vom PHP-Script selbst extrahieren zu lassen.

        Genau das wird auch gemacht.
        Die Zeilen oben sorgen nur für ne schöne URL.
        Ausgewertet wird das ganze dann über REQUEST_URI .. explode.. "/"

        Fein; warum machst Du dann einen over head, indem Du unnötig GET-Daten produzierst?

        AddCharset        utf-8 .css .php .js  
        AddDefaultCharset utf-8  
        DirectoryIndex    index.php  
        ErrorDocument     404 /404-Fehler/  
          
        RewriteEngine     On  
        RewriteCond       %{HTTP_HOST} ^www\.(.+)$  [NC]  
        RewriteRule       ^(.*)$       http://%1/$1 [R=301,L]  
        RewriteRule       !^index.php$ index.php    [L,QSA]
        

        Gruß aus Berlin!
        eddi

        1. Apache HTTP Server Version 2.2.14

          AddCharset        utf-8 .css .php .js

          AddDefaultCharset utf-8
          DirectoryIndex    index.php
          ErrorDocument     404 /404-Fehler/

          RewriteEngine     On
          RewriteCond       %{HTTP_HOST} ^www.(.+)$  [NC]
          RewriteRule       ^(.*)$       http://%1/$1 [R=301,L]
          RewriteRule       !^index.php$ index.php    [L,QSA]

            
            
          Das funktioniert so nicht!  
          Er findet so nicht mal mehr die Stylesheet-Datei.
          
          1. Re:

            Das funktioniert so nicht!
            Er findet so nicht mal mehr die Stylesheet-Datei.

            Wie oben zu lesen war, müsste dabei alles über die index.php geregelt werden. Wenn Du das nicht willst, solltest Du schreiben, was Du willst! Darüber hinaus erwarte ich auch, dass Du mal ins Manual siehst, um die skizzierte Hilfe, wenn nicht an die eigenen, ungenannten Wünsche anzupassen, zumindest nachzuvollziehen. RewriteCond bietet Möglichkeiten zu testen, ob eine Datei tatsächlich existiert.

            Es ist an Dir, Dein Vorstellungen so zu konkretisieren, dass man Dir auch helfen kann - nicht an mir so lange zu raten, bis es für Dich funktioniert.

            Gruß aus Berlin!
            eddi

            1. Hey sorry Eddi du hast Recht.

              Also.
              Das System ist im Moment so aufgebaut das eine URL:
              http://example.com/Klassenname/Methodenname/Parameter1/Parameter2/Parameter3

              lautet.
              Es ist ein MVC Pattern und der Dispatcher sorgt dafür das REQUEST_URI per explode() (PHP) getrennt wird. Dementsprechend wird die passende Klasse includiert und die passende Methode mit den gegebenen Parametern aufgerufen.
              Die File Struktur sieht halt so aus:
              /
              /Controller
              /Model
              /View

              FrontController/Dispatcher & Co. sind in der index.php untergebracht. Hatte sie in eigenen Dateien untergebracht aber wollte dem Server das inkludieren ersparen.

              Bisher hatte ich einen Webspace bei Bplaced.net und hier auf meinem Rechner lief XAMPP. Diese .htaccess Datei funktioniert jetzt aber komischerweise nicht auf meinem neuen Root-Server (Debian, Lenny).
              Dort habe ich PHP installiert mit Apache2 - jeweils die aktuellste Version!

              Ich frage mich also - warum?
              Komisch ist, das wenn ich die normale URL ohne Parameter aufrufe, sprich http://example.com/ die index.php zu Gesicht bekomme. Wenn ich aber http://example.com/index.php eingebe - weiße Seite.
              Gebe ich z.B. http://example.com/Klassenname/Methodenname/Parameter1/ ein, dann findet er die Seite nicht (404 Not Found).

              =/ Hoffe du kannst mir jetzt besser helfen.

              Beste Grüße,
              John

              1. Re:

                http://example.com/Klassenname/Methodenname/Parameter1/Parameter2/Parameter3
                ...
                Die File Struktur sieht halt so aus:
                /
                /Controller
                /Model
                /View

                Wo sind Dateien wie Stylesheets, Javascripte und Bilder untergebracht?

                Komisch ist, das wenn ich die normale URL ohne Parameter aufrufe, sprich http://example.com/ die index.php zu Gesicht bekomme. Wenn ich aber http://example.com/index.php eingebe - weiße Seite.

                Da kommen wir der Sache doch schon näher: Beim Aufruf von http://example.com/ ist REQUEST_URI "/". Beim Aufruf von http://example.com/index.php ist REQUEST_URI "/index.php". Vermutlich nimmt Dein Script darauf keine entsprechende Fallunterscheidung vor. Entweder wird mangels ordentlich konfiguriertem error reporting innerhalb PHPs keine Fehlermeldung generiert, oder das Script verfährt nach Logik des Steuerflusses und gibt gar nichts aus. Denkbar wäre auch noch, dass dank fehlkonfiguriertem ErrorDocument vom Apachen nur ein HTTP-Status 404 zurückgegeben wird. Das ließe sich dann in den Logdaten des Webservers feststellen.

                Gebe ich z.B. http://example.com/Klassenname/Methodenname/Parameter1/ ein, dann findet er die Seite nicht (404 Not Found).

                Das lässt sich in meiner Testumgebung nicht nachvollziehen. Somit ist davon auszugehen, dass noch andere Konfigurationen wirken, die mir nicht ersichtlich sind.

                Gruß aus Berlin!
                eddi

                1. Re:

                  http://example.com/Klassenname/Methodenname/Parameter1/Parameter2/Parameter3
                  ...
                  Die File Struktur sieht halt so aus:
                  /
                  /Controller
                  /Model
                  /View

                  Wo sind Dateien wie Stylesheets, Javascripte und Bilder untergebracht?

                  /Img
                  /Styles
                  /Scripts

                  Komisch ist, das wenn ich die normale URL ohne Parameter aufrufe, sprich http://example.com/ die index.php zu Gesicht bekomme. Wenn ich aber http://example.com/index.php eingebe - weiße Seite.

                  Da kommen wir der Sache doch schon näher: Beim Aufruf von http://example.com/ ist REQUEST_URI "/". Beim Aufruf von http://example.com/index.php ist REQUEST_URI "/index.php". Vermutlich nimmt Dein Script darauf keine entsprechende Fallunterscheidung vor.

                  Entweder wird mangels ordentlich konfiguriertem error reporting innerhalb PHPs keine Fehlermeldung generiert,

                  E_STRICT | E_ALL

                  oder das Script verfährt nach Logik des Steuerflusses und gibt gar nichts aus. Denkbar wäre auch noch, dass dank fehlkonfiguriertem ErrorDocument vom Apachen nur ein HTTP-Status 404 zurückgegeben wird. Das ließe sich dann in den Logdaten des Webservers feststellen.

                  Nichts zu sehen...
                  Es muss an Mod_Rewrite bzw der Htaccess liegen. Bin ich mir sicher.

                  =/ SO ein Schei**

                  liebe gräße, danke für deine HIlfe

                  1. Re:

                    Oben ist meine Mail-Adresse. Schreib mir bitte mal eine Mail, wo ich mir das ganze ansehen kann (PHP-Code, Serverkonfiguration und .htaccess).

                    Gruß aus Berlin!
                    eddi