Martin Hein: .htaccess | mod_rewrite verhält sich merkwürdig

Hallo Forum,

ich habe in einer .htaccess diverse RewriteRules definiert, die
auf meinem xampp funktionieren, sich aber auf dem Live-Server
anders verhalten. Ich kann es mir nicht erklären !

.htaccess
---------------------------------------------------------------------
Options +FollowSymLinks
Options -Indexes

ErrorDocument 404 /_content/index.php

RewriteEngine On
RewriteBase /

1) Alle Anfagen auf Verzeichnisse (ausser denen mit '_' am Anfang werden nach index.php umgeleitet

RewriteRule ^([^_]).+/$ /_content/index.php?%{QUERY_STRING}

2) Alle Anfragen die nicht mit 'dcbkk' beginnen ...

RewriteCond %{SERVER_NAME} !^dcbkk(.*)
#... werden nach daimlerchryslerbkk.de umgeleitet
RewriteRule (.*) http://www.daimlerchryslerbkk.de/

3) Alle Anfragen mit http (ausser auf /_admin/ und css-files) werden auf https umgeleitet

RewriteCond %{SERVER_PORT} !^443$
RewriteCond %{REQUEST_URI} !/_admin/
RewriteCond %{REQUEST_URI} !(.*).css$
RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI}

4) Anfagen mit leerem REQUEST_URI werden auf die Homepage umgeleitet

RewriteRule ^$ /_content/?site_id=1&%{QUERY_STRING}

5) Alle Anfragen mit https auf /_admin/ werden auf http umgeleitet

RewriteCond %{SERVER_PORT} ^443$
RewriteCond %{REQUEST_URI} /_admin/
RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI}

---------------------------------------------------------------------

Die Datei ist gewachsen und sicherlich lässt sie sich optimieren.
Aber auf meinem System macht sie das, was sie soll. Auf dem
Liveserver verhält sie sich anders:

Unterschiedlich ist der Umgang mit # 2). Das ist die letzte Regel,
die ich eingeführt habe. Ich hätte sie eigentlich ganz als erstes
definiert (in der Erwartung, dass dann keine anderen Regeln mehr
gelesen werden). Aber dem ist nicht so:

  • Steht sie ganz oben greift immernoch die Umleitung nach https
      und dann zeigt der Browser mir eine 302 an.

  • Steht sie an Position 2) funktioniert alles, wie gewünscht:
      alle Aufrufe mit !'dcbkk' werden umgeleitet. In der Adresszeile
      steht die Adresse, wohin die Umleitung gegangen ist.

  • Auf dem Liveserver wird trotz Umleitung die eingegebene Adresse
      und es wird ein jedem Fall nach https umgeleitet.

Sorry, ich arbeite zum ersten mal mit mod_rewrite und darin sind
möglicherweise logische Fehler. Aber bei mir macht sie, was sie
soll. auf dem Liveserver nicht.

kann mir jemand helfen ?

tausen Dank und
beste gruesse,
martin

  1. Hellihello Martin,

    mage es sein, dass Du noch ein "Flag" setzen kannst, irgendein Großbuchstabe wie "L", damit dann nach der jeweiligen Condition auch "Schluss" ist. Sonst läuft er von einer zur nächsten, die dann ja immer noch "matchen".

    Dank und Gruß,

    frankx

    1. Hallo frankx,

      right, das mit dem Flag war ein Supertipp ! tausend Dank !!!
      Ich habe die Regeln jetzt so umsortieren können, wie die
      Reihenfolge logisch ist, indem ich mit [L] ein weiterlesen
      jeweils explizit unterbunden habe.

      .htaccess
      ---------------------------------------------------------------
      Options +FollowSymLinks
      Options -Indexes

      ErrorDocument 404 /_content/index.php

      RewriteEngine On
      RewriteBase /

      1) Alle Anfragen die nicht mit 'dcbkk' beginnen ...

      RewriteCond %{SERVER_NAME} !^dcbkk(.*)
      #... werden nach daimlerchryslerbkk.de umgeleitet
      RewriteRule ^(.*) http://www.daimlerchryslerbkk.de/ [L]

      2) Alle Anfragen mit http (ausser auf /_admin/) werden auf https umgeleitet

      RewriteCond %{SERVER_PORT} !^443$
      RewriteCond %{REQUEST_URI} !/_admin/
      RewriteCond %{REQUEST_URI} !(.*).css$
      RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI} [L]

      3) Alle Anfragen mit https auf /_admin/ werden auf http umgeleitet

      RewriteCond %{SERVER_PORT} ^443$
      RewriteCond %{REQUEST_URI} /_admin/
      RewriteRule (.*) http://%{SERVER_NAME}%{REQUEST_URI} [L]

      4) Alle Anfagen auf Verzeichnisse (ausser denen mit '_' am Anfang werden nach index.php umgeleitet

      RewriteRule ^([^_]).+/$ /_content/index.php?%{QUERY_STRING}

      5) Anfagen mit leerem REQUEST_URI werden auf die Homepage umgeleitet

      RewriteRule ^$ /_content/?site_id=1&%{QUERY_STRING}

      ---------------------------------------------------------------

      das Einzige wo es nicht ganz richtig funktioniert, ist folgendes:

      Bei der Eingabe von https scheint er weiterzulesen. Dann werde
      ich zwar weitergeleitet, aber in der Adresszeile steht noch
      was ich eingegeben habe. Wenn ich das ganze mit http mache, ändert
      sich auch die Adresszeile.

      beste gruesse,
      martin

  2. Hi,

    2) Alle Anfragen die nicht mit 'dcbkk' beginnen ...

    RewriteCond %{SERVER_NAME} !^dcbkk(.*)
    #... werden nach daimlerchryslerbkk.de umgeleitet
    RewriteRule (.*) http://www.daimlerchryslerbkk.de/

    dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.

    3) Alle Anfragen mit http (ausser auf /_admin/ und css-files) werden auf https umgeleitet

    RewriteCond %{SERVER_PORT} !^443$
    RewriteCond %{REQUEST_URI} !/_admin/
    RewriteCond %{REQUEST_URI} !(.*).css$
    RewriteRule (.*) https://%{SERVER_NAME}%{REQUEST_URI}

    Würde in dem Fall diese Umleitung greifen?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.

      ja, genauso ist er auch gedacht: Umleitung im zutreffenden Fall.
      Nach der Umleitung sollte nichts mehr passieren, weil ja schon
      umgeleitet ist

      Würde in dem Fall diese Umleitung greifen?

      Die Umleitung sollte nach der ersten Regel bereits erfolgt sein
      und daher allefolgenden nicht mehr beachtet werden.

      beste gruesse,
      martin

      1. Hi,

        dies ist ein externer Redirect. Betrachte ihn so, als hätte der User per Hand diese Adresse in seinen Browser eingegeben.

        ja, genauso ist er auch gedacht: Umleitung im zutreffenden Fall.
        Nach der Umleitung sollte nichts mehr passieren, weil ja schon
        umgeleitet ist

        Würde in dem Fall diese Umleitung greifen?

        Die Umleitung sollte nach der ersten Regel bereits erfolgt sein
        und daher allefolgenden nicht mehr beachtet werden.

        Du hast den Einwand nicht verstanden.
        Was passiert beim Redirect? Es kommt ein komplett neuer Request vom Client.
        Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.

        MfG ChrisB

        1. Hi,

          Du hast den Einwand nicht verstanden.

          offensichtlich nicht.

          Was passiert beim Redirect? Es kommt ein komplett neuer Request vom Client.

          ganz genau so ist es auch gedacht.

          Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.

          und genau da ist mein Verständnisproblem:

          warum ist der Request "engehend" ? Bzw. sicher ist er das,
          aber ganz wo anders. Nämlich da, wohin er umgeleitet wurde.

          besten dank für Klärung und

          viele gruesse,
          martin

          1. Hi,

            Und was passiert mit eingehenden Requests? Genau, sie durchlaufen deine kompletten RewriteRules.

            und genau da ist mein Verständnisproblem:

            warum ist der Request "engehend" ?

            Mit einem Redirect-Header sagst du dem Client, "bitte schau woanders nach, frag nach der Adresse XYZ".

            Wo ist jetzt der Unterschied dazu, ob der Client gleich XYZ angefordert haette? Genau, es gibt absolut keinen.

            MfG ChrisB