# nginx .htpasswd klappt nicht richtig



## steff (21. Jan. 2015)

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:

```
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:

```
....
location ~ /sec/ {
      auth_basic "Login Sec-Bereich";
....
```
Suche jetzt schon den ganzen Tag erfolglos nach einer Lösung.
Hat jemand eine Idee?

Steff


----------



## Till (21. Jan. 2015)

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 (22. Jan. 2015)

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:

```
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?


----------



## steff (23. Jan. 2015)

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


----------



## nowayback (23. Jan. 2015)

Zitat von steff:


> location /sec/ {


kann so nicht stimmen und


Zitat von steff:


> client_max_body_size 10G; # set max upload size


wird nicht funktionieren. laut meinen letzten tests musste man unter 2G bleiben


Zitat von steff:


> rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect; rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect; rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;


ist glaube ich unnötig


----------



## steff (23. Jan. 2015)

Hallo nowayback,

Was stimmt denn bei


> location /sec/ {


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?


----------



## steff (24. Jan. 2015)

Kann jemand mir sagen, was bei 



> locaten /sec/ {


falsch ist?


----------



## steff (30. Jan. 2015)

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


----------



## nowayback (30. Jan. 2015)

Sorry hatte den Thread irgendwie aus den Augen verloren. 

Du hast dir das viel zu komplieziert gemacht. Du hast:

```
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:

```
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. ;-)


----------



## steff (30. Jan. 2015)

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


----------



## nowayback (30. Jan. 2015)

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?


----------



## steff (30. Jan. 2015)

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


----------



## nowayback (1. Feb. 2015)

So... also folgender Block klappt bei mir problemlos:

```
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 (2. Feb. 2015)

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


----------



## steff (5. Feb. 2015)

Hallo NoWayBack,

leider verstehe ich es immer noch nicht.
Habe statt (wie in deinem code)


Zitat von nowayback:


> location ~ \.php$ { try_files /5e309ed99235a4f30996075e504e8539.htm @php; }


jetzt folgendes in die sec-location eingetragen:

```
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?


```
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:

```
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


----------



## nowayback (5. Feb. 2015)

```
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


----------



## steff (5. Feb. 2015)

Hallo NoWayBack,

super und danke für die schnelle Antwort.
1. Ich verstehe aber einfach diese zeile von Dir nicht:


Zitat von nowayback:


> try_files /5e3235a4f3sdasafjdsfj09075e504e89.htm @php;


Wenn ich diese in die /sec/-location eintrage, erhalte ich im browser die Meldung:
"*500 Internal Server Error*"
2. Frage: Weshalb steht dieses 

```
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:

```
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


----------



## nowayback (5. Feb. 2015)

Zitat von steff:


> 1. Ich verstehe aber einfach diese zeile von Dir nicht:


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 { ... }


Zitat von steff:


> 2. Frage: Weshalb steht dieses zweimal in der default (einmal in der /sec/-location)?


einmal für die php dateien in /sec/ und einmal für den Rest unterhalb / der nicht separat angegeben wurde.


Zitat von steff:


> 3. Frage: Das hier hatte ich z.B. ganz rausgenommen Wozu brauche ich das?


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)


Zitat von steff:


> Wenn ich das verstehen würde, dann wäre mir echt geholfen.


Nen Großteil steht eigentlich in der doku und lässt sich daher gut nachvollziehen.


----------



## nowayback (5. Feb. 2015)

Zitat von nowayback:


> 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;


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


----------

