2011-01-14 26 views
8

Quiero proteger una carpeta de mi sitio web con una contraseña usando auth_basic. Esta carpeta contiene php-scripts que deben ejecutarse si se solicitan.nginx: auth_basic y php

He intentado lo siguiente:

location /admin { 
    auth_basic "Admin-Section"; 
    auth_basic_user_file /myfolder/.htpasswd; 
} 

location ~ ^/admin/.*\.php$ { 
    auth_basic "Admin-Section"; 
    auth_basic_user_file /myfolder/.htpasswd; 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include fastcgi_params; 
} 

me pedirá el nombre de usuario/contraseña cuando se solicite el php-scripts en ese administrador-carpeta, pero los scripts PHP siempre va a ser descargado en lugar de ejecutarse a través de fastcgi .

¿Qué estoy haciendo mal?

EDITAR: En mi máquina local todo funciona bien con esta configuración. o0
EDITAR: Por cierto, php está trabajando fuera de la carpeta de administración con las mismas opciones de fastcgi.
EDIT: OMG! La configuración del sitio se almacenó en/etc/nginx/sites-available/mysite y/etc/nginx/sites-enabled/contenía un enlace simbólico al archivo mysite. Desde hace algún tiempo cambiando el archivo mysite no tuvo ningún efecto. P.ej. cambiar todas las ubicaciones para "denegar todo" no tuvo ningún efecto. Los archivos fueron enviados sin problemas.
Así que eliminé el enlace simbólico y reinicié el servidor. Luego creé el enlace simbólico nuevamente, reinicié el servidor y todo funciona como se esperaba. ¿Alguien puede explicar el comportamiento extraño?

respecto Gest,
Biggie

Respuesta

-1

tiene que quitar la línea siguiente:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
+1

Esa es una línea necesaria cuando PHP-FPM se está ejecutando en una jaula chroot. – Zenexer

1

Esta es una vieja pregunta, pero sólo tenía el mismo problema, así que aquí está la explicación.

Nginx usa the rules described in the docs para que coincida con los bloques de ubicación. Para los bloques convencionales, la coincidencia más larga será la que se aplicará, pero para las expresiones regulares es siempre el primer bloque coincidente que se aplicará.

En su servidor de producción, es muy probable que haya un bloque location ~ \.php$ encima de su bloque de administración, por lo tanto, el bloque de escucha que publicó nunca se aplicó.

Relato largo: cuando se trata de la expresión regular escuchar bloques en nginx, el orden importa. Coloque las coincidencias más específicas antes que las generales.

12

Con esta configuración, nginx solo coincidirá con uno de los dos bloques, el de mayor precedencia.

La solución es combinar el bloque PHP en el bloque AUTH. Este es el enfoque recomendado por el propio autor de nginx, Igor Sysoev.

location /admin/ { 
    auth_basic "Admin-Section"; 
    auth_basic_user_file /myfolder/.htpasswd; 
    location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include  fastcgi_params; 
    } 
} 

location ~ \.php$ { 
    fastcgi_pass 127.0.0.1:9000; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
    include  fastcgi_params; 
} 
+1

¿hay alguna forma de evitar la duplicación obvia del código? – peedee

+0

Ponga el código duplicado en un archivo separado e inclúyalo de cada bloque. – fisharebest

-1

Quizás olvidó añadir raíz:

location ~ .\php$ { 
    #Lines of code... 
    root /your/document/root; 
    #Lines of code... 
} 

location /admin/ { 
    #Lines of code... 
    root /your/document/root; 
    #Lines of code... 
}