Encoder: RewriteRule mag nicht...

Hallo

Ich hab ein Problem mit einer Rewriterule.
Mein .htaccess sieht so aus
DirectoryIndex index.php

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([a-zA-Z_0-9]*)$ index.php?name=$1 [qsa]

Damit soll alles was example.com/seitenname heißt umgewandelt werden in example.com/index.php?name=seitenname

Lokal funktioniert das wunderbar. Auf eine Mietserver geht es auch, wenn sich alles im Hauptverzeichnis abspielt. Wenn ich ein Unterverzeichnis einsetze geht nix mehr.
Also example.com/unterverzeichnis/seitenname soll umgewandelt werden in example.com/unterverzeichnis/index.php?name=seitenname
Ich hab in der RewriteRule schon verschiedene Konstellationen probiert. Mit unterverzeichnis im Regex (also so: ^unterverzeichnis/([a-zA-Z_0-9]*)$), als unterverzeichnis/index... und ohne. Es kommt einfach nur eine leere Seite, statt dem Inhalt. Es wird nicht index.php aufgerufen, das würde ich an der Ausgabe erkennen.
Entweder greift also der Regex nicht, oder index.php wird nicht da gefunden wo es liegt.

Wo muss ich da ansetzen? Ich hätte die Rule am liebsten so dass ich die ganze Seite ohne Veränderung im Hauptverzeichnis oder einem beliebigen Unterverzeichnis haben kann und sie überall funktioniert.

  1. Hi,

    Also example.com/unterverzeichnis/seitenname soll umgewandelt werden in example.com/unterverzeichnis/index.php?name=seitenname

    Und die .htaccess liegt wo?

    Ich hab in der RewriteRule schon verschiedene Konstellationen probiert. Mit unterverzeichnis im Regex (also so: ^unterverzeichnis/([a-zA-Z_0-9]*)$), als unterverzeichnis/index... und ohne. Es kommt einfach nur eine leere Seite, statt dem Inhalt. Es wird nicht index.php aufgerufen, das würde ich an der Ausgabe erkennen.
    Entweder greift also der Regex nicht, oder index.php wird nicht da gefunden wo es liegt.

    Und wo liegt die index.php?

    Wo muss ich da ansetzen?

    GGf. eine passende RewriteBase setzen.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
  2. Moin Encoder,

    RewriteRule ^([a-zA-Z_0-9]*)$ index.php?name=$1 [qsa]
    […]
    Also example.com/unterverzeichnis/seitenname soll umgewandelt werden in example.com/unterverzeichnis/index.php?name=seitenname

    Vermutlich wird sich die RewriteBase unterscheiden und dadurch matcht der Regex oben nicht mehr. Versuchs ggfls mal so:

      
    RewriteRule ^(?:.*/)?([a-zA-Z_0-9]*)$ index.php?name=$1 [qsa]  
    
    

    Das matcht unabhängig von der RewriteBase.

    LG,
     CK

    1. Moin,

      hm, da macht mein Password-Manager komische Dinge hier… das sollte natürlich als „Christian Kruse“ verfasst werden.

      LG,
       CK

  3. Tach!

    Eine Umgehungslösug wäre, eine ganz allgemeine RewriteRule zu verwenden (die RewriteCond bleiben bestehen, so wie du sie hast) ...

    RewriteRule .* index.php [qsa]

    ... und dann die REQUEST_URI oder PATH_INFO auszuwerten, beides bei PHP in $_SERVER zu finden.

    Alternativ geht in neueren Apachen auch FallbackResource index.php, aber nicht in allen PHP-Einbind-Konfigurationen.

    dedlfix.

    1. Hallo, späte Rückmeldung ich bin grad erst dazu gekommen.
      Ich bekomme das nicht hin, bin jetzt soweit dass ich .htaccess für die beiden Verzeichnisbäume anpasse und hoffe dass ich sie nicht überschreibe.

      Mein Problem beim Hoster ist dass index.php gar nicht erst aufgerufen wird. Ich kann daraus also auch nicht $_SERVER auslesen denn mein Script wird nicht aktiviert. Stattdessen kommt eine Fehlerseite des Hosters.
      Mein Wunsch wäre eine Angabe ohne RewriteBase setzen zu müssen. Ich war der Meinung das wäre ganz einfach, wenn .htaccess im Verzeichnis liegt bezieht sich auch index.php auf dieses Verzeichnis. Warum es das nicht tut weiß ich nicht.

  4. Moin,

    Du weißt, wie PHP mit gleichnamigen Parametern umgeht? Ok, worauf ich hinaus will anhand eines Beispiels:

    URL: /images.html?action=delete&id=123 (QSA: name=images&action=delete&id=123)

    funktioniert wie gewünscht, das Bild wird gelöscht. Anderer URL:
         /profiles.html?action=delete&id=123 (QSA: name=profiles&action=delete&id=123)

    tut auch, natürlich per .htaccess abgesichert. Jetzt kommt ein gewitzter User auf diese Idee:

    URL: /images.html?action=delete&id=123&name=profiles
                                           ^ hiermit bildet Deine Rule den URL auf Parameter ab

    (QSA: name=images&action=delete&id=123&name=profiles)

    Nun zeigt die Route auf /profiles.html weil der letzte Parameter den vorherigen überschreibt, Dein Passwortschutz wird umgangen. URLs sind eindeutig, Parameter sind manipulierbar. Deine Parameterkontrolle müsste die Zugangskontrolle mit einschließen und wird dadruch unnötig kompliziert.

    MfG

    --
    Nach dem Bumsen ein Pfeifen im Ohr? Tja, Alter, früher gabs Applaus...
    1. Hi
      Bei der Seite geht es nur um statische Informationen, nichts wo man sich anmelden oder irgendetwas verändern könnte. Trotzdem ist das ein interessanter Gedanke! Modifikationen sollte man ja per POST abbilden statt GET, das würde diesen Fall verhindern.

      Ich könnte als Parametername statt name auch fhendhabcnfrhriwhdh verwenden, darauf kommt beim ausprobieren so schnell keiner :-) Die neu generierte URL ist ja für den Besucher nirgends sichtbar.

      Ich möchte damit nur einfachere URLs verwenden können. .../gallerie sieht schöner aus als /index.php?name=gallerie. Die Behandlung soll in einem einzigen Script landen das die immer gleichen Ablaufschritte durchführt und u.a. das Menü zusammenbaut und so weiter.
      Gibt es dafür eine ganz andere empfohlene Vorgehensweise?

      Die anderen Beiträge werd ich mir durchsehen und ausprobieren. Ich habe den ganzen Mechanismus noch nicht wirklich durchschaut und was der gehostete Server draus alles macht weiß ich auch nicht.

      1. @@Encoder:

        nuqneH

        .../gallerie sieht schöner aus als /index.php?name=gallerie.

        Nicht wirklich.

        Qapla'

        --
        „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
        1. Muss dir zustimmen, falsch geschrieben siehts natürlich noch übler aus.
          So richtig hübsch finde ich wenn mans richtig schreibt und ohne Parameter :-)

      2. hi,

        Gibt es dafür eine ganz andere empfohlene Vorgehensweise?

        Ja klar. Deine Rule möchte einen URL parametrisieren, Dein index.php möchte aus diesen Parametern wieder die eindeutige Zuordnung, ergo kann index.php auch gleich den URL nehmen als eindeutigen Schlüssel für die Routing-Table.

        Und anstelle der Condition für physisch vorhandene Ressourcen, nutze Dateierweiterungen, Beispiel:

        RewriteRule !\.(cgi|css|jpg|jpeg|js|gif|ico|txt|pac|png|appcache|htm|bin|pdf)$ /cgi-bin/fwdbf.cgi [L]  
        
        

        Damit hast Du das auch getrennt, im Beispiel werden .jpeg, .jpg, .js, .htm u.a. Dateien direkt vom Server ausgeliefert.

        Die anderen Beiträge werd ich mir durchsehen und ausprobieren. Ich habe den ganzen Mechanismus noch nicht wirklich durchschaut und was der gehostete Server draus alles macht weiß ich auch nicht.

        Du hättest bei jedem Request grundsätzlich immer mindestens einen Parameter, welcher zu kontrollieren wäre.

        Schönes Wochenende :)