2011-01-14 5 views
8

Je veux protéger un dossier de mon site Web avec un mot de passe en utilisant auth_basic. Ce dossier contient des scripts php qui devraient être exécutés s'ils sont demandés.nginx: auth_basic et php

J'ai essayé les éléments suivants:

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

On me demandera de nom d'utilisateur/mot de passe lors de la demande des scripts php-dans cette admin-dossier, mais les scripts php-seront téléchargés toujours lieu d'être exécuté via FastCGI .

Qu'est-ce que je fais de mal?

EDIT: Sur ma machine locale, tout fonctionne correctement avec cette configuration. o0
EDIT: BTW, php travaille en dehors du dossier admin avec les mêmes options fastcgi.
EDIT: OMG! La config du site était stockée dans/etc/nginx/sites-available/mysite et/etc/nginx/sites-enabled/contenait un lien symbolique vers le fichier mysite. Depuis quelque temps, le changement du fichier mysite n'a eu aucun effet. Par exemple. changer tous les endroits pour "nier tout" n'a eu aucun effet. Les fichiers ont été envoyés sans problème.
J'ai donc supprimé le lien symbolique et redémarré le serveur. Ensuite, j'ai créé à nouveau le lien symbolique, redémarré le serveur et tout fonctionne comme prévu. Quelqu'un peut-il expliquer le comportement étrange?

ce qui a trait Gest,
Biggie

Répondre

-1

Vous devez supprimer la ligne suivante:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
+1

C'est une ligne nécessaire lorsque php-FPM est en cours d'exécution dans une prison chroot. – Zenexer

1

Ceci est une vieille question, mais je viens d'avoir le même problème, alors voici l'explication.

Nginx utilise the rules described in the docs pour faire correspondre les blocs de localisation. Pour les blocs conventionnels, la correspondance la plus longue sera celle qui sera appliquée, mais pour les expressions régulières, sera toujours le premier bloc correspondant qui sera appliqué. Sur votre serveur de production, vous aviez probablement un bloc location ~ \.php$ au-dessus de votre bloc d'administration, par conséquent le bloc d'écoute que vous avez publié n'a jamais été appliqué.

Longue histoire courte: lorsqu'il s'agit d'une expression régulière, écoutez des blocs dans nginx, l'ordre compte. Mettez les correspondances plus spécifiques avant les générales.

12

Avec cette configuration, nginx ne fera correspondre que un des deux blocs - celui avec la plus haute priorité.

La solution est de combiner le bloc PHP en le bloc AUTH. C'est l'approche recommandée par l'auteur de nginx lui-même, 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

est-il un moyen d'éviter la duplication de code évidente? – peedee

+0

Placez le code dupliqué dans un fichier séparé et incluez-le dans chaque bloc. – fisharebest

-1

Peut-être que vous avez oublié d'ajouter la racine:

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

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