Max Neuer: Problem mit den File Extensions / .htaccess

Hallo,

Meine .htaccess macht Probleme. Mein Ziel ist es die File Extensions zu verstecken. Dazu habe ich folgenden Code in die htaccess gepackt:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.html -f
RewriteRule ^(.*)$ $1.html

Jedoch geht es nicht ._. Was mach ich falsch? :(

PS: Ich bin komplett neu auf dem Gebiet ".htaccess" also kommt mir bitte nicht mir irgendwelchen Fachbegriffen :D

  1. Meine .htaccess macht Probleme.

    Nö. Du bist der Verursacher.

    Mein Ziel ist es die File Extensions zu verstecken. … Was mach ich falsch? :(

    Du willst die Dateinamenserweiterungen erst verwenden und dann verstecken. Das ist ein wenig zu viel hin- und her und "kostet teuer Rechenleistung".

    Was hindert Dich denn, diese Endungen einfach WIRKLICH wegzulassen und den Default(-Content)-Type auf text/html zu setzen?

    Jedoch geht es nicht

    ... ist auch keine brauchbare Fehlerbeschreibung.

    1. Tach!

      Du willst die Dateinamenserweiterungen erst verwenden und dann verstecken. Das ist ein wenig zu viel hin- und her und "kostet teuer Rechenleistung".

      Es kostet viel mehr und deutlich teurere Entwicklernerven, keine Dateiendungen für die Dateien zu verwenden. Rechenleistung ist hingegen spottbillig. Ohne Endungen erkennen die meisten Editoren und IDEs den Dateityp nicht und unterschlagen nützliche Hilfsfunktionen für das Bearbeiten.

      dedlfix.

      1. Ohne Endungen erkennen die meisten Editoren und IDEs den Dateityp nicht und unterschlagen nützliche Hilfsfunktionen für das Bearbeiten.

        Ach das. Ist mir entfallen. Meine Editoren erkennen den Mime-Typ spätestens beim Öffnen einer Datei mit Inhalt.

  2. Tach!

    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.html -f
    RewriteRule ^(.*)$ $1.html
    

    Jedoch geht es nicht ._. Was mach ich falsch? :(

    "Geht nicht" gibt es auf eine Menge Arten. Welche ist es bei dir? Schau dazu ins ErrorLog. Ich rate mal.

    Warum prüfst du auf %{REQUEST_FILENAME}\.html und nicht nur auf %{REQUEST_FILENAME}?

    mod_rewrite arbeitet so, dass der Request umgeschrieben wird und dann erneut durch die Maschinerie des Apachen läuft, inklusive der .htaccess, durch die er bereits lief. Deshalb muss man es ausschließen, dass vorhandene Dateien erneut umgeschrieben werden.

    Du schreibst also xxx nach xxx.html um und prüfst für den erneuten Request, ob xxx.html.html keine Datei ergibt. Die Bedingung passt und die RewriteRule wird abgearbeitet. Das dürfte eine Endlosschleife erzeugen, die der Apache irgendwann abbricht.

    PS: Ich bin komplett neu auf dem Gebiet ".htaccess" also kommt mir bitte nicht mir irgendwelchen Fachbegriffen :D

    Doch, warum denn nicht? Es gibt Suchmaschinen und Rückfragen, wenn man etwas nicht weiß oder versteht. Ich befinde mich nicht in deinem Kopf und weiß daher nicht, was du verstehst und was nicht. Wie soll ich dann Unverständliches vermeiden können?

    dedlfix.

    1. "Geht nicht" gibt es auf eine Menge Arten. Welche ist es bei dir? Schau dazu ins ErrorLog. Ich rate mal.

      Kein Error im ErrorLog.

      Warum prüfst du auf %{REQUEST_FILENAME}\.html und nicht nur auf %{REQUEST_FILENAME}?

      hab ich eben umgeschrieben ^-^

      PS: Ich bin komplett neu auf dem Gebiet ".htaccess" also kommt mir bitte nicht mir irgendwelchen Fachbegriffen :D

      Doch, warum denn nicht? Es gibt Suchmaschinen und Rückfragen, wenn man etwas nicht weiß oder versteht. Ich befinde mich nicht in deinem Kopf und weiß daher nicht, was du verstehst und was nicht. Wie soll ich dann Unverständliches vermeiden können?

      Gut, ich bitte um Entschuldigung.

      PS: Es geht leider immer noch nicht. (keine Error's im Error Log :))

      1. PS: Es geht leider immer noch nicht. (keine Error's im Error Log :))

        1.)

        LogLevel alert rewrite:trace8 könnte helfen. ... ist aber leider nur in der Konfiguration des Servers bzw, virtuellen Hosts möglich. Nicht in der .htaccess.

        2.)

        Zeig doch mal Deine Änderungen...

        1. Hallo Google weiß alles,

          LogLevel alert rewrite:trace8 könnte helfen. ... ist aber leider nur in der Konfiguration des Servers bzw, virtuellen Hosts möglich. Nicht in der .htaccess.

          Zeig doch mal Deine Änderungen...

          geordnete Listen gibts hier auch ;-)

          Bis demnächst
          Matthias

          --
          Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
          1. RewriteEngine on
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteCond %{REQUEST_FILENAME}? -f
            RewriteRule ^(.*)$ $1.html
            
            1. RewriteEngine on
              RewriteCond %{REQUEST_FILENAME} !-d
              RewriteCond %{REQUEST_FILENAME}? -f
              RewriteRule ^(.*)$ $1.html
              

              Ja. Und wo ist das (hier) erforderliche und von dedlix geforderte "Last" am Ende der RewriteRule?

              RewriteRule ^(.*)$ $1.html [L]
              

              dedlix hat es wie folgt beschrieben:

              mod_rewrite arbeitet so, dass der Request umgeschrieben wird und dann erneut durch die Maschinerie des Apachen läuft, inklusive der .htaccess, durch die er bereits lief. Deshalb muss man es ausschließen, dass vorhandene Dateien erneut umgeschrieben werden.

              1. Ach so. Da war Dir beim Murksen noch was falsch gelungen:

                RewriteEngine on
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteCond %{REQUEST_FILENAME} !-f
                RewriteRule ^(.*)$ $1.html [L]
                
              2. Tach!

                RewriteEngine on
                RewriteCond %{REQUEST_FILENAME} !-d
                RewriteCond %{REQUEST_FILENAME}? -f
                RewriteRule ^(.*)$ $1.html
                

                Ja. Und wo ist das (hier) erforderliche und von dedlix geforderte "Last" am Ende der RewriteRule?

                Das "Last" habe ich nicht gefordert.

                mod_rewrite arbeitet so, dass der Request umgeschrieben wird und dann erneut durch die Maschinerie des Apachen läuft, inklusive der .htaccess, durch die er bereits lief. Deshalb muss man es ausschließen, dass vorhandene Dateien erneut umgeschrieben werden.

                "Vorhandene Dateien ausschließen" ist nicht gleichzusetzen mit "den Umschreibprozess komplett zu stoppen". Letzteres geht erst seit 2.4 mit dem Flag END. Aber das hilft nichts, wenn man einen anderen Fehler im System hat. Dazu gleich mehr.

                "Last" beendet nicht das Umschreiben, sondern veranasst nur, dass im aktuellen Durchlauf keine weiteren Regeln beachtet werden. Wenn das die einzige Regel in der Datei ist, bringt "Last" genau gar nichts. Der umgeschriebene Request geht auch mit "Last" erneut durch die interne Requestverarbeitung des Apachen. END würde das verhindern.

                Der Fehler wird vielmehr syntaktischer Natur sein. Zum einen fehlt dem -f die Negation, und dann ist da noch ein Fragezeichen zu viel.

                Das END wird aber kein (alleiniger) Ersatz für RewriteCond sein, denn man muss ja trotzdem ausschließen, dass Grafiken und andere physisch vorhande Dateien nach .html umgeschrieben werden. Mit den beiden RewiteCond (wenn man sie denn richtig schriebe) kommt man jedenfalls ohne END und L aus.

                dedlfix.

                1. "Last" beendet nicht das Umschreiben, sondern veranasst nur, dass im aktuellen Durchlauf keine weiteren Regeln beachtet werden. Wenn das die einzige Regel in der Datei ist, bringt "Last" genau gar nichts. Der umgeschriebene Request geht auch mit "Last" erneut durch die interne Requestverarbeitung des Apachen. END würde das verhindern.

                  Stimmt. War undurchdacht.

                  Er MUSS übrigens END verwenden, denn wenn es mal einen 404er-Kandidat (NOT FOUND) gibt wird diese Schleife sonst nie beendet (irgendwann kommt freilich ein 500er/SERVER-ERROR), sondern es wird immer wieder '.html' angehangen.

                  Die Datei (Document-Root)/foo.html existiere nicht:

                  Durchlauf angeforderte Ressource  Rewrite
                  ----------------------------------------------------------
                  1.        GET /foo                GET /foo.html
                  2.        GET /foo.html           GET /foo.html.html
                  3.        GET /foo.html.html      GET /foo.html.html.html
                  …
                  
                  1. Tach!

                    Er MUSS übrigens END verwenden, denn wenn es mal einen 404er-Kandidat (NOT FOUND) gibt wird diese Schleife sonst nie beendet (irgendwann kommt freilich ein 500er/SERVER-ERROR), sondern es wird immer wieder '.html' angehangen.

                    Stimmt, den Fall habe ich nicht bedacht. Üblich ist ja, dass man die Umschreibung auf eine serverseitige Script-Umgebung schickt und dort den Nicht-Vorhanden-Fall erkennt und mit einem 404er Fehlerdokument beantwortet. Wenn man aber nur statische HTML-Dateien hat, ist END eine Lösung, solange ein 2.4er Apache zur Verfügung steht. Ansonsten müsste man als Alternative eine weitere Bedingung hinzufügen, die bei anhängendem .html fehlschlägt, woraufhin der Apache-eigene 404er Mechanismus greifen kann.

                    dedlfix.

  3. @@Max Neuer

    Was mach ich falsch?

    Du verwendest mod_rewrite.

    Options +MultiViews ist dein Freund.

    LLAP 🖖

    --
    “You might believe there are benefits for the developer, but first of all, you should put those behind the interest of the user.” —Stefan Tilkov
    Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
    1. Tach!

      Options +MultiViews ist dein Freund.

      Die Empfehlung von MultiViews sollte immer mit einer Warnung daherkommen, dass diese Funktion auch gern mal unbeabsichtigte Dinge tut, denn sie versucht hauptsächlich zu erraten, was passieren soll. mod_rewrite hingegen arbeitet nach vom Andender klar definierten Regeln und erzeugt ein voraussagbares Ergebnis.

      Natürlich arbeitet auch MultiViews nach definierten Regeln, aber die sind sozusagen in der Arbeitsweise versteckt. Ungewünschtes Verhalten muss erstmal in Erfahrung gebracht werden, und dann kann man es auch nicht einfach so wegkonfigurieren.

      dedlfix.