Julius: mod_rewrite + Content-Negotiation

Hallo,

ich will mir eine Hompega machen, bin mir aber noch nicht ganz sicher, ob ich "normales" HTML benutzen oder das HTML mit PHP generieren will. Damit ich (im Falle einer "Umentscheidung") nicht alle Links ändern muss, dachte ich an Content-Negtiation, dass ich also auf /page verlinken würde, nicht auf /page.html oder /page.php.

Apache unterstützt dieses Verfahren und das funktioniert auch so weit. Aber ich würde gerne, dass wenn jemand versucht, /page.html (oder /page.php) auzurufen, er nach /page weitergeleitet wird.

Dazu habe ich mir folgendes überlegt:

RewriteRule     ^(.*).(html|php|gif|jpeg|png|txt)$ http://www.plenz.com/$1 [NS,NC,R=301,L]

Allerdings kreiert das eine Endlos-Schleife aus Redirects, erst von /page.html nach /page und von da aus wieder nach /page.html und so weiter...

Was kann ich tun? Irgendwelche Tipps, Vorschläge?

Julius

  1. Hallo,

    ich will mir eine Hompega machen, bin mir aber noch nicht ganz sicher, ob ich "normales" HTML benutzen oder das HTML mit PHP generieren will. Damit ich (im Falle einer "Umentscheidung") nicht alle Links ändern muss, dachte ich an Content-Negtiation, dass ich also auf /page verlinken würde, nicht auf /page.html oder /page.php.

    Obwohl ich weiss, dass viele Puristen genau Dein Vorhaben toll finden
    und sagen, dass die "Dateiendigung" aus der URL der "Ressource"
    verbannt werden muesse, plaediere ich stark dafuer, die URLs
    fuer (X)HTML-Ressourcen auf .html enden zu lassen.
    Es hat Vorteile beim lokalen Bearbeiten und Betrachten,
    und auch fuer die Benutzer, wenn sie eine oder mehrere
    Deiner Seiten herunterladen (von Hand oder mit wget,
    HTTrack u.s.w.) - dann funktionieren naemlich auch
    alle relativen Links noch, solange die Dateien im
    gleichen Verzeichnis sind.

    Gerade auf dem Apachen ist es doch problemlos moeglich,
    auch Dateien mit der Endigung .html durch den PHP-Parser
    zu schicken.

    Aber eben, es ist Geschmackssache, und Deine URLs ohne
    "Dateiendigung" entsprechen auf jeden Fall den Entsprechungen
    des W3C - und Du bist damit modern und cool! ;-)

    RewriteRule     ^(.*).(html|php|gif|jpeg|png|txt)$ http://www.plenz.com/$1 [NS,NC,R=301,L]
    Allerdings kreiert das eine Endlos-Schleife aus Redirects, erst von /page.html nach /page und von da aus wieder nach /page.html und so weiter...

    Sollte es eigentlich nicht.
    Erstens wegen dem L ("last"), zweitens, weil Browser gemaess der HTTP Spec.
    Endlosschleifen erkennen und abbrechen sollten.

    Was erwartest Du beim Abruf von /page.html in dem Platzhalter $1?

    Gruesse,

    Thomas

    --
    Bitte keine Mails mit Fachfragen - dafuer gibt es das Forum!
    Ich mag es, wenn URLs verlinkt sind (</faq/#Q-19>).
    Oft gestellte PHP-Fragen beantwortet die dclp-FAQ bestens: http://www.dclp-faq.de/
    1. Hallo,

      Aber eben, es ist Geschmackssache, und Deine URLs ohne
      "Dateiendigung" entsprechen auf jeden Fall den Entsprechungen
      des W3C - und Du bist damit modern und cool! ;-)

      Ja ;)

      RewriteRule     ^(.*).(html|php|gif|jpeg|png|txt)$ http://www.plenz.com/$1 [NS,NC,R=301,L]
      Allerdings kreiert das eine Endlos-Schleife aus Redirects, erst von /page.html nach /page und von da aus wieder nach /page.html und so weiter...

      Sollte es eigentlich nicht.
      Erstens wegen dem L ("last"), zweitens, weil Browser gemaess der HTTP Spec.
      Endlosschleifen erkennen und abbrechen sollten.

      Dillo macht das, aber Opera verfängt sich darin...

      Was erwartest Du beim Abruf von /page.html in dem Platzhalter $1?

      Ich erwarte sowas wie "/page" oder "page". Halt alles bis zu dem letzten Punkt (+Dateiendung).

      Ich bin gerade bei einem Freund, sonst könnte ich ein Beispiel posten...

      Julius

      1. Hallo,

        [...] weil Browser gemaess der HTTP Spec.
        Endlosschleifen erkennen und abbrechen sollten.

        Dillo macht das, aber Opera verfängt sich darin...

        Wenn Du schon Opera hast, dann kannst Du auch wunderbar bequem
        die automatischen Weiterleitungen in Opera abschalten und dann
        Schritt fuer Schritt beobachten, wohin Du jeweils umgeleitet wirst,
        weil Du es naemlich manuell bestaetigen musst!

        RewriteRule     ^(.*).(html|php|gif|jpeg|png|txt)$ http://www.plenz.com/$1 [NS,NC,R=301,L]
        Was erwartest Du beim Abruf von /page.html in dem Platzhalter $1?
        Ich erwarte sowas wie "/page" oder "page". Halt alles bis zu dem letzten Punkt (+Dateiendung).

        Ich gebe gerne zu, dass ich mich mit RegExp und mod_rewrite nicht
        richtig auskenne. Aber ich wende diese Dinger auch nicht an... ;-)

        Wenn Du "/page" erwartest, wird die URL zu http://www.plenz.com//page - nicht
        unbedingt das wahre, oder?

        Ich hoffe, dass Du mit Opera ein paar Erkenntnisse gewinnst!

        mfg,
        Thomas

  2. Hallo,

    Was kann ich tun? Irgendwelche Tipps, Vorschläge?

    Setze vor die RewriteRule noch folgende Rewrite Condition (bzw. passe sie Deinen Beduerfnissen an...):

    RewriteCond %{THE_REQUEST} .(html|php|gif|jpeg|png|txt) [NC]

    Das überprüft, ob die Dateiendung im vom Browser angefragten Request-String drinsteht. Nach der Umleitung tut sie es ja nicht mehr -- deshalb entsteht keine Endlosschleife.

    Falls Du die RegEx noch genauer spezifizieren willst (IMHO nicht noetig...), denke dran, dass in dem String nicht nur der Seitenname, sondern mehr drinsteht. Eine typische Anfrage ist "GET /index.hmtl HTTP/1.1".

    Grüße, Alex.

    1. RewriteCond %{THE_REQUEST} .(html|php|gif|jpeg|png|txt) [NC]

      Das überprüft, ob die Dateiendung im vom Browser angefragten Request-String drinsteht. Nach der Umleitung tut sie es ja nicht mehr -- deshalb entsteht keine Endlosschleife.

      Vielen Dank, Alex, da funktiniert wunderbar! Danke!

      Julius