Alfie: .htaccess Redirect

Hallo,

ich stehe gerade auf dem Schlauch. Ich will alle *.htm Seiten permanent auf *.phtml umleiten.

Ich habe:
RewriteEngine On
RewriteRule ^(.*)\.htm$ /$1.phtml [R=301,L]

Ich will aber, dass Seiten in Unterordnern ihren Pfad behalten. Obige Regel leitet auf die Domain um, was natürlich zu einem 404er führt:
/foo/bar.htmbar.phtml.
Also sowohl /foo/bar.htm/foo/bar.phtml als auch
bar.htmbar.phtml

  1. Hi,

    ich stehe gerade auf dem Schlauch. Ich will alle *.htm Seiten permanent auf *.phtml umleiten.

    Ich habe:
    RewriteEngine On
    RewriteRule ^(.*)\.htm$ /$1.phtml [R=301,L]

    hm. Im Betreff schreibst Du redirect, hier rewrite.

    IIRC kriegt der Client (z.B. Browser) vom Rewrite nix mit, während der Redirect über den Client geschieht ('bitte hol die Seite von "neueAdresse" ab').

    Oder war's umgekehrt?

    Was ist der Zweck der Übung?

    Hast Du für .phtml einen speziellen Handler?

    Wenn ja: warum nicht den Handler für .htm (ggf. zusätzlich) einrichten?

    cu,
    Andreas a/k/a MudGuard

    1. Hi,

      Ich habe:
      RewriteEngine On
      RewriteRule ^(.*)\.htm$ /$1.phtml [R=301,L]

      hm. Im Betreff schreibst Du redirect, hier rewrite.

      Verwirrung.

      Was ist der Zweck der Übung?

      Usprünglich hatte ich *.htm-Seiten mit kleinen eingebetteten php-Skripten und so eingerichtet, dass geparsed:

      AddType application/x-httpd-php .htm

      Das war nach einem Server-Umzug für meinen neuen Provider nicht mehr akzeptabel. Solche Seiten müssen *.phtml sein. Soll sein. Umbenannt und die *.htm-Seiten gelöscht.
      Es bleibt aber das Problem mit Links von externen Sites (ganze Menge). Die laufen natürlich ins Leere.

      Hast Du für .phtml einen speziellen Handler?

      Wenn ja: warum nicht den Handler für .htm (ggf. zusätzlich) einrichten?

      Kannitverstan. 😉

      1. Moin Alfie,

        Das war nach einem Server-Umzug für meinen neuen Provider nicht mehr akzeptabel. Solche Seiten müssen *.phtml sein. Soll sein. Umbenannt und die *.htm-Seiten gelöscht.
        Es bleibt aber das Problem mit Links von externen Sites (ganze Menge). Die laufen natürlich ins Leere.

        also lieber rewrite als redirect.

        Dein Regexp-Pattern ist an sich schon einmal korrekt (wobei ich eher .+ statt .* nähme – außer, Du hast tatsächlich auch /.htm als Pfad).

        Dann bleibt noch die RewriteRule und da darf dann kein Redirect definiert sein, wenn umgeschrieben werden soll:

        RewriteRule "^(.+)\.htm$" $1.phtml [QSA]
        

        Viele Grüße
        Robert

        1. Servus Robert,

          Dein Regexp-Pattern ist an sich schon einmal korrekt (wobei ich eher .+ statt .* nähme – außer, Du hast tatsächlich auch /.htm als Pfad).

          Immerhin was…

          Dann bleibt noch die RewriteRule und da darf dann kein Redirect definiert sein, wenn umgeschrieben werden soll:

          RewriteRule "^(.+)\.htm$" $1.phtml [QSA]
          

          Knapp daneben. Funktioniert wie gewünscht im root, aber bei Dateien in Unterverzeichnissen lande ich auch im root (wie gehabt) und wieder bei einem 404-er.

          1. Hallo Alfie,

            seltsam.

            Ganz sicher, dass im Unterordner keine .htaccess Datei mit RewriteRule steht?! Als vergessener Test, zum Beispiel? Oder dass Du die RewriteRules in <Directory>-Blöcke gesetzt hast?

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hall Rolf,

              seltsam.

              Tröstlich.

              Ganz sicher, dass im Unterordner keine .htaccess Datei mit RewriteRule steht?! Als vergessener Test, zum Beispiel? Oder dass Du die RewriteRules in <Directory>-Blöcke gesetzt hast?

              <nachguck>
              Nö.
              </nachguck>

              1. Hallo Alfie,

                dann bin ich ratlos.

                Ich kann das Phänomen nämlich durchaus nachvollziehen, aber eben nur mit einer .htaccess im Unterordner.

                Wenn eine .htaccess mit diesem Inhalt

                RewriteEngine On
                RewriteRule ^(.*)\.txt /$1.html [QSA]
                

                nur im Webroot steht, überschreibt sie brav /foo/test.txt durch /foo/test.html. Egal, ob da $1.html oder /$1.html steht (ist aber nur egal weil die .htaccess im Root steht).

                Vielleicht fängst Du damit mal an, vielleicht schießt der PHP Handler auch noch irgendwie quer. Käme mir zwar – wie gesagt – seltsam vor, aber ich bin nicht Winnetou[1].

                Caching-Effekte bei der .htaccess, die dazu führen könnten, dass deine aktuellste Version nicht zieht, wären mir keine bekannt.

                Es KÖNNTE höchstens sein, dass dein Browser oder irgendein vorgelagerter Cache deines Hosters die falsche HTTP 301 Antwort gecached hat. Du könntest mal /foo/bar.htm?bust=1982345 aufrufen - irgendein Dummy-Queryparameter, hauptsache eine andere URL.

                Rolf

                --
                sumpsi - posui - obstruxi

                1. Häuptling aller Apachen ↩︎

          2. Moin Alfie,

            Dann bleibt noch die RewriteRule und da darf dann kein Redirect definiert sein, wenn umgeschrieben werden soll:

            RewriteRule "^(.+)\.htm$" $1.phtml [QSA]
            

            Knapp daneben. Funktioniert wie gewünscht im root, aber bei Dateien in Unterverzeichnissen lande ich auch im root (wie gehabt) und wieder bei einem 404-er.

            Wie „landest“ Du denn mit dieser Regel „wieder im Root“? So, wie ich sie geschrieben habe, wird da nur der Pfad umgeschrieben, während in der URL-Zeile des Browsers ….htm stehen bleibt.

            Ich habe jedenfalls exakt diese Regel auf meinem Apachen erfolgreich getestet. Jetzt ist die Frage, was bei Dir genau passiert.

            Viele Grüße
            Robert

  2. Hallo Alfie,

    wo genau steht die .htaccess-Datei, in der Du diese RewriteRule definiert hast? Nur im Root deines Webs? Oder auch im /foo Ordner?

    Wenn Du die URL /foo/bar/dings.htm abrufst, dann sieht eine RewriteRule in /.htaccess sie als "foo/bar/dings.htm". Eine RewriteRule in /foo/.htaccess sieht das Gleiche als "bar/dings.htm" und die RewriteRule in /foo/bar/.htaccess sieht nur "dings.html". Das muss man beim Formulieren der Rules beachten.

    Gültig sind zuerst die RewriteRules in dem Ordner, der der Ziel-Ressource am nächsten ist. Aber die in den Elternverzeichnissen werden auch beachtet, sofern die RewriteRules der tieferen Ordner nicht STOP gesagt haben (mit dem L in den eckigen Klammern).

    Deshalb MÜSSTE es eigentlich reichen, wenn Du nur in /.htaccess eine RewriteRule hast.

    Zum Unterschied zwischen rewrite und redirect:

    rewrite
    Browser schickt Request /foo/bar.htm
    Server tut intern so, als hättest Du /foo/bar.phtml abgerufen und antwortet mit dem Inhalt dieser Seite (bzw. dem PHP Output)
    redirect
    Browser schickt Request /foo/bar.htm
    Server antwortet mit HTTP Status 301: "Ist umgezogen, neue Adresse ist /foo/bar.phtml"
    Browser sagt "ach so" und schickt neuen Request an /foo/bar.phtml
    Server schickt Inhalt dieser Seite (bzw. den PHP Output)

    Der Unterschied in der .htaccess Datei ist das [R=301,L]. Das bestellt den Statuscode 301 und schickt ihn zusammen mit dem Ergebnis der RewriteRule zurück (das R). Danach hört der Apache auf, nach RewriteRules zu sorgen (das L).Aber Achtung, die Apache Doku sagt, dass ein R einen Zielpfad mit / vorneweg haben muss. Ein Redirect von ^(.*).htm$ nach $1.phtml ist nicht möglich. Nur nach /$1.phtml.

    Das von Robert genannte QSA bedeutet, dass ein Querystring der umgeschriebenen URL übernommen werden soll. Wenn Du also URLs mit Parametern hast, brauchst Du das QSA, sonst gehen die verloren.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      wo genau steht die .htaccess-Datei, in der Du diese RewriteRule definiert hast? Nur im Root deines Webs?

      Korrekt.

    2. Hallo Rolf,

      Deshalb MÜSSTE es eigentlich reichen, wenn Du nur in /.htaccess eine RewriteRule hast.

      Grau ist alle Theorie.

      Inzwischen habe ich spasshalber in ein Unterverzeichnis eine .htaccess mit redirect gestellt. Ich lande wieder im root, wo das gute Stück natürlich nicht ist.

      Konkret:
      https://bebac.at/articles/R-on-Windows-101.phtml
      https://bebac.at/articles/R-on-Windows-101.htm
      https://bebac.at/articles/R-on-Windows-101.htm?foo=1234

      Rudi Ratlos heisst der Geiger.

      1. Hallo Alfie,

        Rudi Ratlos mit viel Pomade
        In den wenigen Haaren, die er noch hat

        Jo, passt zu mir 😉. Bis auf die Pomade. Und 80 bin ich auch nocht nicht ganz…

        Meinen Gedanken mit dem Cachebuster hast Du ausprobiert?

        Es gab mal die RewriteLog Direktive, womit man die Rewrite-Engine zum Protokollieren ihrer Aktivitäten bewegen konnte.

        Gibt's nicht mehr, statt dessen eine "per module" Konfiguration des Serverloggings. Allerdings nur auf Server und VHost Ebene, nicht in der .htaccess.

        Wenn's nicht ein Cache ist, dann muss IRGENDWO eine andere RewriteRule stecken, die querschießt. Aber um Rewrite-Logging einzuschalten, wirst Du wohl deinen Hoster brauchen. Vielleicht haben die ja eine Idee, DIE wollen doch, dass Du das tust.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Hallo Rolf,

          Rudi Ratlos mit viel Pomade
          In den wenigen Haaren, die er noch hat

          Jo, passt zu mir 😉. Bis auf die Pomade. Und 80 bin ich auch nocht nicht ganz…

          Noch nicht ganz 70…

          Meinen Gedanken mit dem Cachebuster hast Du ausprobiert?

          Siehe oben, 3. Link. Nervig dass mit dem 2. Link meine sorgsam gepflegte 404_not_found.html nicht angezeigt wird, sondern nur das lakonische „File not found.“

          Wenn's nicht ein Cache ist, dann muss IRGENDWO eine andere RewriteRule stecken, die querschießt.

          No Sir!

          Aber um Rewrite-Logging einzuschalten, wirst Du wohl deinen Hoster brauchen. Vielleicht haben die ja eine Idee, DIE wollen doch, dass Du das tust.

          Mein Hoster? Arroganz gepaart mit Ignoranz.

          1. Hallo Alfie,

            geht doch. Hast Du noch was geändert?

            Oder es ist doch der Cache.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Rolf,

              geht doch. Hast Du noch was geändert?

              Nö.

              Oder es ist doch der Cache.

              Mistverfluchter! Strg-F5 war nicht genug, in den Einstellungen (Feuerfuchs) komplett gelöscht, passt. Danke!

              1. Da sag ich doch nur

                😜

      2. Moin Alfie,

        Inzwischen habe ich spasshalber in ein Unterverzeichnis eine .htaccess mit redirect gestellt. Ich lande wieder im root, wo das gute Stück natürlich nicht ist.

        wieso Redirect? Mein Vorschlag leitet nicht weiter, sondern schreibt die URL um.

        Kann es sein, dass Deine vorherigen Versuche mit den Weiterleitungen im Browser gecached sind und deshalb noch gezogen werden? Was passiert denn, wenn Du den Browsercache leerst oder einen anderen Browser ausprobierst?

        Viele Grüße
        Robert