Ankündigung

Einklappen
Keine Ankündigung bisher.

Reihenfolge von htaccess, access control und mod_rewrite

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Reihenfolge von htaccess, access control und mod_rewrite

    Und zwar habe ich Folgendes entdeckt, was ich nicht ganz verstehe (Apache 2.4)

    Verzeichnisstruktur
    Code:
    /
     .htaccess
     index.php
     assets/
     > datei.css
     ordner/
     > datei.txt
     geheim/
     > .htaccess
        Require all denied
     > geheimedatei.txt
    In der .htaccess im Hauptverzeichnis ist folgende Regel
    Code:
    RewriteRule ^(virtuellerordner|geheim)(/|$) index.php [L]
    die m E virtuellerordner und geheim auf die index.php umleiten sollte.

    Nun wird aber offenbar die .htaccess im Unterverzeichnis geheim vor der .htaccess im Hauptordner gelesen und man bekommt 403-Fehler statt index.php, wenn man auf geheim zugreifen will. Die RewriteRule wird laut Log nicht beachtet, und das selbst wenn ich sie (vor dem Require all denied) in die geheim-.htaccess packe.
    Woran liegt das?

  • #2
    . Die RewriteRule wird laut Log nicht beachtet, und das selbst wenn ich sie (vor dem Require all denied) in die geheim-.htaccess packe.
    Musst Du rewrite Log setzen.
    https://wiki.apache.org/httpd/RewriteLog

    Kommentar


    • #3
      Wenn man das Unterverzeichnis aufruft, bspw "/geheim/test", kommt mod_rewrite gar nicht zum Zug (kein strip-per-dir-prefix, kein applying pattern im Log)

      Kommentar


      • #4
        Zitat von Durin Beitrag anzeigen
        Wenn man das Unterverzeichnis aufruft, bspw "/geheim/test", kommt mod_rewrite gar nicht zum Zug (kein strip-per-dir-prefix, kein applying pattern im Log)
        Ich hab nicht so den Durchblick, was Du eigentlich willst, und Deine Regex halte ich potentiell für suboptimal.

        Möglicherweiese hilft Dir ein Generator weiter oder Du erklärst es mal in Worten.
        http://www.ipdistance.com/mod_rewrite.php

        Kommentar


        • #5
          er meint es so, dass diese Schema functioniert bei ihm nicht
          Further note that httpd must look for .htaccess files in all higher-level directories, in order to have a full complement of directives that it must apply. (See section on how directives are applied.) Thus, if a file is requested out of a directory /www/htdocs/example, httpd must look for the following files:
          PHP-Code:
          /.htaccess
          /www/.htaccess
          /www/htdocs/.htaccess
          /www/htdocs/example/.htaccess 
          And so, for each file access out of that directory, there are 4 additional file-system accesses, even if none of those files are present.
          The configuration directives found in a .htaccess file are applied to the directory in which the .htaccess file is found, and to all subdirectories thereof. However, it is important to also remember that there may have been .htaccess files in directories higher up. Directives are applied in the order that they are found. Therefore, a .htaccess file in a particular directory may override directives found in .htaccess files found higher up in the directory tree. And those, in turn, may have overridden directives found yet higher up, or in the main server configuration file itself.
          Signaturrrrrrr

          Kommentar


          • #6
            Er sagte doch das bei einem Zugriff auf ein Unterverzeichniss keine rewrite geparst wird.
            das kann ja auch daran liegen, dass rewrite nicht eingeschaltet ist:
            Code:
             RewriteEngine on
            hat er jedenfalls nirgends geposted.

            Kommentar


            • #7
              Doch, rewrite ist natürlich an/wird eingeschaltet, und steht auch entsprechend im Log.
              Aber nicht, wenn man das Unterverzeichnis aufruft.
              Code:
              #/.htaccess
              RewriteEngine On
              RewriteRule ^(virtuellerordner|geheim)(/|$) index.php [L]
               -----
              #/geheim/.htaccess
              Require all denied
              Wenn Apache als Erstes /geheim/.htaccess liest, dort "Require all denied" liest und folglich die rewriterules ignoriert ist das denke ich die hinreichende Erklärung.


              Bei meinen weiteren Experimenten wird aber folgender Fall nicht von dieser Erklärung abgedeckt, sondern die .htaccess scheint nicht strikt von oben nach unten durchgearbeitet zu werden
              Folgende Konfiguration führt zu einem 403
              Code:
              #/.htaccess
               [leer]
               -----
              #/geheim/.htaccess
              RewriteEngine On
              RewriteRule .* /index.php [R=302,L]
              Require all denied
              dies hier ebenfalls
              Code:
              #/.htaccess
               [leer]
               -----
              #/geheim/.htaccess
              RewriteEngine On
              RewriteRule .* ../index.php [E=rewritten:y]
              <If "%{ENV:rewritten} != 'y'">
                  Require all denied
              </If>

              Laut Log wird bei dieser Version
              Code:
              #/.htaccess
               [leer]
               -----
              #/geheim/.htaccess
              RewriteEngine On
              RewriteRule .* ../index.php [E=rewritten:y]
              <If "%{ENV:rewritten} != 'y'">
                  RewriteRule .* - [E=test:x]
              </If>
              sogar nur lediglich text=x gesetzt, rewritten nicht, also nur der If-Block abgearbeitet oder was auch immer

              Dies hier führt zum beabsichtigten Ergebnis und setzt rewritten=y
              Code:
              #/.htaccess
               [leer]
               -----
              #/geheim/.htaccess
              RewriteEngine On
              RewriteRule .* ../index.php [E=rewritten:y]
              Das hat sich vom ursprünglichen Problem bereits etwas entfernt, auch möglich, das ich irgendetwas Fundamentales übersehen habe oder irgendwas an der Installation schief ist (werde ich noch mal auf einem anderen Server ausprobieren), aber zumindest die Ergebnisse kann ich so überhaupt nicht nachvollziehen.

              Hoffe das war soweit etwas verständlicher ^^
              (Es geht mir rein um die Funktionsweise, nicht direkt um die konkrete Lösung eines speziellen Anwendungsproblems)

              Kommentar


              • #8
                Warum macht man das eigentlich so umständlich? Warum liegen "geheime" Dateien überhaupt im (öffentlichen) Document Root?

                Kommentar


                • #9
                  Ausgang der Sache war, dass ich ein Verzeichnis erst blockiert und danach via Script wieder verfügbar gemacht habe, ohne Pfade zu ändern.
                  Das Problem was ich jetzt habe ist aber nicht die Lösung des Ausgangsproblems, sondern dass ich nicht verstehe, wieso obige Vorgehensweisen (ganz besonders mit den zwei Rewrite-Rules ) nicht so funktionieren wie angenommen. Also dachte ich, ich frage mal, ob mir das jemand erklären kann.

                  Kommentar


                  • #10
                    Du sollst uns erst die vollständige .htaccess und Logs zeigen, sonst müssen wir mit alle mögliche Situations ausspielen.
                    Signaturrrrrrr

                    Kommentar


                    • #11
                      Loglevel rewrite:trace8, htaccess gleiche Reihenfolge wie oben, Aufruf von /geheim/test, root /var/www/test

                      Code:
                      [authz_core:error] AH01630: client denied by server configuration: /var/www/test/geheim/test
                      
                      [authz_core:error] AH01630: client denied by server configuration: /var/www/test/geheim/test
                      
                      [authz_core:error] AH01630: client denied by server configuration: /var/www/test/geheim/test
                      jeweils /geheim/.htaccess , /.htaccess leer
                      Code:
                      RewriteRule .* ../index.php [E=rewritten:y]
                      <If "%{ENV:rewritten} != 'y'">
                          RewriteRule .* - [E=test:x]
                      </If>
                      
                      [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b580a0/initial] [perdir *If/] applying pattern '.*' to uri '/var/www/test/geheim/test'
                      [rewrite:trace5] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b580a0/initial] setting env variable 'test' to 'x'
                      [rewrite:trace1] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b580a0/initial] [perdir *If/] pass through /var/www/test/geheim/test
                      Ergebnis: 404
                      Code:
                      RewriteRule .* ../index.php [E=rewritten:y]
                      
                      [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] strip per-dir prefix: /var/www/test/geheim/test -> test
                      [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] applying pattern '.*' to uri 'test'
                      [rewrite:trace2] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] rewrite 'test' -> '../index.php'
                      [rewrite:trace5] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] setting env variable 'rewritten' to 'y'
                      [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] add per-dir prefix: ../index.php -> /var/www/test/geheim/../index.php
                      [rewrite:trace2] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] strip document_root prefix: /var/www/test/geheim/../index.php -> /geheim/../index.php
                      [rewrite:trace1] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b5a0a0/initial] [perdir /var/www/test/geheim/] internal redirect with /geheim/../index.php [INTERNAL REDIRECT]
                      Ergebnis: index.php

                      Kommentar


                      • #12
                        + Pfad-Bug in mod_rewrite, der noch zu der imho merkwürdigen Abarbeitungsreihenfolge dazukommt?

                        Code:
                        #/.htaccess
                          [leer]
                        #/geheim/.htaccess
                        RewriteEngine On
                        RewriteRule .* ../index.php [E=rewritten:y]
                        <If "%{ENV:rewritten} != 'y'">
                            RewriteRule .* ../index.php [E=test:x]
                        </If>
                        
                        [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b640a0/initial] [perdir *If/] applying pattern '.*' to uri '/var/www/test/geheim/test'
                        [rewrite:trace2] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b640a0/initial] [perdir *If/] rewrite '/var/www/test/geheim/test' -> '../index.php'
                        [rewrite:trace5] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b640a0/initial] setting env variable 'test' to 'x'
                        [rewrite:trace3] mod_rewrite.c(476): 127.0.0.1 - - [test.localhost/sid#7f7a20b75ea0][rid#7f7a20b640a0/initial] [perdir *If/] add per-dir prefix: ../index.php -> *If/../index.php
                        
                        Ergebnis: 400 Bad Request
                        -----

                        Meine erste Frage war, ob Apache beim Zugriff aufs Unterverzeichnis die .htaccess in der Reihenfolge /geheim/.htaccess und danach /.htaccess abarbeitet und folglich die Regel im übergeordneten Verzeichnis das Require all denied im Unterverzeichnis gar nicht mehr beeinflussen könnte.

                        Kommentar


                        • #13
                          vielleich hilft RewriteBase ?
                          Signaturrrrrrr

                          Kommentar

                          Lädt...
                          X