nginx .htpasswd klappt nicht richtig

Dieses Thema im Forum "Server Administration" wurde erstellt von steff, 21. Jan. 2015.

  1. steff

    steff New Member

    Hallo,

    ich habe ein problem mit der Einbindung des Verzeichnisschutzes in meine nginx-default-datei:
    Mit dieser Konfiguration wird korrekt bei der index.htm nach dem login gefragt.
    Rufe ich aber z.B. die apc.php auf, dann wird nicht nach dem login gefragt und die Datei direkt angezeigt:
    Code:
    server {
        listen 443 ssl;
        server_name ;
    
        root /var/www;
        index index.php index.htm;
    
         location  /sec/ {
          auth_basic "Login Sec-Bereich";
          auth_basic_user_file /var/www/sec/.htpasswd;
         }
    
        #Zertifikate
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
    
        client_max_body_size 10G; # set max upload size
        fastcgi_buffers 64 4K;
        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;
       location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
        location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
        }
        location / {
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
    
            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
    
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
    
            try_files $uri $uri/ index.php;
        }
        location ~ ^(.+?\.php)(/.*)?$ {
            try_files $1 = 404;
    
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            fastcgi_param PATH_INFO $2;
            fastcgi_param HTTPS on;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
            expires 30d;
            # Optional: Don't log access to assets
            access_log off;
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
        }
    
         location ~ /\.ht {   
            deny all;
        }
    }
    Mit einer ~ vor dem Pfad, wird zwar bei den anderen Datei auch nach einem login gefragt, aber dann will der Browser die Datei anschliessend herunterladen:
    Code:
    ....
    location ~ /sec/ {
          auth_basic "Login Sec-Bereich";
    ....
    Suche jetzt schon den ganzen Tag erfolglos nach einer Lösung.
    Hat jemand eine Idee?

    Steff
     
  2. Till

    Till Administrator

    PHP ist unter nginx doch eine eigene location, Du musst den .htaccess Schutz also auch in der location einfügen die für PHP zuständig ist.
     
    steff gefällt das.
  3. steff

    steff New Member

    Hallo Till,

    Habe etwas Bange, dass ich durch wilde Ausprobiererei irgendwelche Seiteneffekte bekomme.
    Muesste es in etwas so aussehen?
    Habe die vorhandene php-location in die /sec/-location verschoben:
    Code:
    server {
        listen 443 ssl;
        server_name ;
    
        root /var/www;
        index index.php index.htm;
    
    
        #Zertifikate
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
    
        client_max_body_size 10G; # set max upload size
        fastcgi_buffers 64 4K;
        rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
        rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
        rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;
        error_page 403 = /core/templates/403.php;
        error_page 404 = /core/templates/404.php;
       location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
        location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
        }
        location / {
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
    
            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
    
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
    
            try_files $uri $uri/ index.php;
        }
        location ~ ^(.+?\.php)(/.*)?$ {
            try_files $1 = 404;
    
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            fastcgi_param PATH_INFO $2;
            fastcgi_param HTTPS on;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
            expires 30d;
            # Optional: Don't log access to assets
            access_log off;
        }
    
       location  /sec/ {
                  auth_basic "Login Sec-Bereich";
                  auth_basic_user_file /var/www/sec/.htpasswd;
              
                 # Hier eingefuegt
                location ~ \.php$ {
                      try_files $uri =404;
                      fastcgi_split_path_info ^(.+\.php)(/.+)$;
                     fastcgi_pass unix:/var/run/php5-fpm.sock;
                     fastcgi_index index.php;
                    include fastcgi_params;
                      }
         }
    
         location ~ /\.ht {
            deny all;
        }
    }

    Ist das so richtig? Wird denn nicht jetzt die php5-fpm nur für den /sec-ordner geladen?
     
    Zuletzt bearbeitet: 22. Jan. 2015
  4. steff

    steff New Member

    Kann mir keiner sagen ob ich das richtig gemacht habe?
    Irgendwie habe ich das Gefuehl, dass owncloud jetzt langsamer aufbaut.
     
  5. nowayback

    nowayback Well-Known Member

    kann so nicht stimmen und
    wird nicht funktionieren. laut meinen letzten tests musste man unter 2G bleiben
    ist glaube ich unnötig
     
  6. steff

    steff New Member

    Hallo nowayback,

    Was stimmt denn bei
    Die anderen beiden Hinweise von Dir werde ich mal umsetzen.
    Ehrlich gesagt, habe den Code im letzten Zitat, aus einer Anleitung.
    Wird caldav, carddav und webdav ohne die Zeilen keine Probleme beim Syncen auf meinen Geraeten machen?

    Vielleicht kannst Du mir auch einen kurzen hilfreichen Hinweis zu meinem Problem mit meinem verzeichnisschhutz und der php-location geben?
     
  7. steff

    steff New Member

    Kann jemand mir sagen, was bei
    falsch ist?
     
  8. steff

    steff New Member

    Hallo nowayback,
    habe bis jetzt immer noch nicht herausgefunden, was Du bei "location /sec/ {" meintest bzw. was dort nicht stimmen kann?
    Würdest Du Dich bitte nochmal melden
     
  9. nowayback

    nowayback Well-Known Member

    Sorry hatte den Thread irgendwie aus den Augen verloren.

    Du hast dir das viel zu komplieziert gemacht. Du hast:
    Code:
       location  /sec/ {
                  auth_basic "Login Sec-Bereich";
                  auth_basic_user_file /var/www/sec/.htpasswd;
             
                 # Hier eingefuegt
                location ~ \.php$ {
                      try_files $uri =404;
                      fastcgi_split_path_info ^(.+\.php)(/.+)$;
                     fastcgi_pass unix:/var/run/php5-fpm.sock;
                     fastcgi_index index.php;
                    include fastcgi_params;
                      }
         }
    es hätte vollkommen folgendes gereicht:
    Code:
    location  /sec/ {
        auth_basic "Login Sec-Bereich";
        auth_basic_user_file /path/to/sec/.htpasswd;
    }
    location in location ist in den meisten Fällen Blödsinn, deshalb hatte ich oben schon geschrieben dass das so nicht stimmen kann ohne genauer zu lesen, sorry. ;-)
     
  10. steff

    steff New Member

    Danke für die Antwort.
    So wie Du es geschrieben hattest, war es auch zuerst bei mir.
    Allerdings wurden die Unterverzeichnisse nicht im sec-ordner mit geschützt.
    das einzige was funktionierte war eine Login-Abfrage, wenn ich die index.htm aufgerufen habe.
    Dateien, zb. apc.php, wurden ohne login-abfrage einfach ausgeführt.

    Bei einem Forums-eintrag wurde mal geschrieben, dass man das irgendwie in die php-location einfügen muss.
    Das klappte nicht, daher habe ich die php-location in die /sec/-location eingefügt. Damit klappte es.. allerdings mit unguten Gefühl und evtl. performance-verlust bei oc.

    Weisst Du evtl., was ich da falsch habe?

    Steff

    Übringes das einzige Forum bisher, welches einem versucht zu helfen.
    naja.. und vielleicht kann ich spaeter hier auch mal helfen :)
     
  11. nowayback

    nowayback Well-Known Member

    ich kann nur mal versuchen das nachzustellen, aber generell müsste es so funktionieren wie ich oben geschrieben habe. Hast du versucht die php datei aufzurufen bevor du dich angemeldet hattest oder erst danach?
     
  12. steff

    steff New Member

    Hi nwb,
    ich hatte versucht, die php-datei direkt aufgerufen, ohne mich anmelden zu müssen.
    Als ich dann die index.htm aufrief, erschien bei mir dann die login-aufforderung.

    Schönen Abend
     
  13. nowayback

    nowayback Well-Known Member

    So... also folgender Block klappt bei mir problemlos:
    Code:
            location ~ \.php$ {
                try_files /5e309ed99235a4f30996075e504e8539.htm @php;
            }
    
            location @php {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/lib/php5-fpm/webY.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_intercept_errors on;
            }
    
            location /secret/ {
                    auth_basic "Members Only";
                    auth_basic_user_file /var/www/clients/clientX/webY/web/secret/.htpasswd;
    
                    location ~ \.php$ {
                        try_files /5e309ed99235a4f30996075e504e8539.htm @php;
                    }
            }
    
     
    steff gefällt das.
  14. steff

    steff New Member

    Hallo NWB,

    danke für Deine Hilfe. Du hast also eine php-location in die sec-location eingebunden.
    Vielen Dank... ich werde es direkt ausprobieren, sobald ich nicht mehr bettlägrig bin (haette jetzt keinen sinn :) ).

    Grüße
    Steff
     
  15. steff

    steff New Member

    Hallo NoWayBack,

    leider verstehe ich es immer noch nicht.
    Habe statt (wie in deinem code)
    jetzt folgendes in die sec-location eingetragen:
    Code:
            location ~ \.php$ {
                    include php;
            } 
    Jetzt bekomme ich Fehlermeldungen beiim restart von php5-fpm.
    Kannst Du Dir bitte den Code nocheinmal kurz anschauen und sagen, was ich für eine weitere location in die /sec/-location eingetragen werden muss?

    Code:
    server {
        listen 444 ssl;
        server_name 134.178.168.2;
    
        root /var/www;
        index index.php index.htm;
    
        #Zertifikate
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
    
    
        client_max_body_size 2G; # set max upload size
        fastcgi_buffers 64 4K;
    
       location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
        }
    
        location / {
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
            try_files $uri $uri/ index.php;
        }
    
        location ~ ^(.+?\.php)(/.*)?$ {
            try_files $1 = 404;
    
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            fastcgi_param PATH_INFO $2;
            fastcgi_param HTTPS on;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
            expires 30d;
            # Optional: Don't log access to assets
            access_log off;
        }
    
    # Passwortschutz fuer /sec-Ordner
        location  /sec/ {
            auth_basic "Login Sec-Bereich";
            auth_basic_user_file /var/www/sec/.htpasswd;
    # -> Was muss hier eingetragen werden?       
          location ~ \.php$ {
                    include php;
            }
        } 
        location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
    
         location ~ /\.ht { 
            deny all;
        }
    }
    
    Was funktioniert ist, wenn ich folgendes mache:
    Code:
     location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
            }
      
        # Passwortschutz fuer /sec-Ordner
        location  /sec/ {
            auth_basic "Login Sec-Bereich";
            auth_basic_user_file /var/www/sec/.htpasswd;
    
            location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
            }
         }
    Habe dann allerdings die "location ~ \.php$ {" zweimal in der default.
    Das ist sicher falsch. Dachte allerdings, dass (wenn die "location ~ \.php$ {" nur in der "/sec/"-location ist, die "location ~ \.php$ {" nicht mehr für den Rest der Konfiguration gilt.
    Ist das richtig?
    Komme da einfach nicht weiter.
    Hoffentlich kannst Du mir weiter helfen.

    Viele Gruesse

    Steff
     
    Zuletzt bearbeitet: 5. Feb. 2015
  16. nowayback

    nowayback Well-Known Member

    Code:
    server {
        listen 444 ssl;
        server_name 134.178.168.2;
    
        root /var/www;
        index index.php index.htm;
    
        #Zertifikate
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
    
    
        client_max_body_size 2G; # set max upload size
        fastcgi_buffers 64 4K;
    
       location = /robots.txt {
            allow all;
            log_not_found off;
            access_log off;
        }
    
        location ~ ^/owncloud/(data|config|\.ht|db_structure\.xml|README) {
            deny all;
        }
    
        location / {
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
            try_files $uri $uri/ index.php;
        }
    
        location ~ ^(.+?\.php)(/.*)?$ {
            try_files $1 = 404;
    
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$1;
            fastcgi_param PATH_INFO $2;
            fastcgi_param HTTPS on;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
    
        location ~* ^.+\.(jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
            expires 30d;
            # Optional: Don't log access to assets
            access_log off;
        }
    
        location ~ \.php$ {
            try_files /5e3235a4f3sdasafjdsfj09075e504e89.htm @php;
        }
    
        location @php {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }
    
         location ~ /\.ht {
            deny all;
        }
    
    # Passwortschutz fuer /sec-Ordner
        location  /sec/ {
            auth_basic "Login Sec-Bereich";
            auth_basic_user_file /var/www/sec/.htpasswd;
    # -> Was muss hier eingetragen werden?     
            location ~ \.php$ {
                try_files /5e3235a4f3sdasafjdsfj09075e504e89.htm @php;
            }
        }
    }
    Das müsste deine config sein, wenn ich jetzt nichts übersehen habe
     
  17. steff

    steff New Member

    Hallo NoWayBack,

    super und danke für die schnelle Antwort.
    1. Ich verstehe aber einfach diese zeile von Dir nicht:
    Wenn ich diese in die /sec/-location eintrage, erhalte ich im browser die Meldung:
    "500 Internal Server Error"
    2. Frage: Weshalb steht dieses
    Code:
     location ~ \.php$ {
      try_files /5e3235a4f3sdasafjdsfj09075e504e89.htm @php;
      }
    zweimal in der default (einmal in der /sec/-location)?

    3. Frage:
    Das hier hatte ich z.B. ganz rausgenommen:
    Code:
        location / {
            rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
            rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;
            rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
            rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;
            rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;
            try_files $uri $uri/ index.php;
        }
    Wozu brauche ich das?
    Könen ohne diese location bei mir die kalendarsync-probleme auftreten?

    Du hast mir jetzt schon viel geholfen und ich bin so nah dran!!
    Wenn ich das verstehen würde, dann wäre mir echt geholfen.

    Einen schönen Abend

    Steff
     
    Zuletzt bearbeitet: 5. Feb. 2015
  18. nowayback

    nowayback Well-Known Member

    http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
    Eigentlich geht es nur darum damit in den @php Block zu kommen und da try_files mindestens 2 Angaben braucht wird eine Datei angegeben die nicht existiert und somit bleibt nur noch der @php Block übrig und der wurde ja vorher bereits definiert durch location @php { ... }
    einmal für die php dateien in /sec/ und einmal für den Rest unterhalb / der nicht separat angegeben wurde.
    steht eigentlich drin, für caldav und carddav, d.h. damit du termine und kontakte synchronisieren kannst (z.B. mit deinem Handy, welches auch caldav und carddav unterstützen muss)
    Nen Großteil steht eigentlich in der doku und lässt sich daher gut nachvollziehen.
     
  19. nowayback

    nowayback Well-Known Member

    Der Block muss raus, der ist doppelt. Das hab ich vorhin gar nicht gesehen... hatte nur dein Beispiel kopiert und den entsprechenden Teil angepasst.
     

Diese Seite empfehlen