2011-01-14 21 views
8

Voglio proteggere una cartella del mio sito Web con una password usando auth_basic. Questa cartella contiene script php che dovrebbero essere eseguiti se richiesti.nginx: auth_basic e php

ho provato la seguente:

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

mi verrà chiesto nome utente/password quando si richiede PHP-script in quella admin-cartella, ma i php-script sarà sempre scaricato invece di essere eseguito tramite FastCGI .

Cosa sto sbagliando?

MODIFICA: sulla mia macchina locale tutto funziona correttamente con questa configurazione. o0
EDIT: BTW, php funziona fuori dalla cartella admin con le stesse opzioni di fastcgi.
MODIFICA: OMG! La configurazione del sito è stata memorizzata in/etc/nginx/sites-available/mysite e/etc/nginx/sites-enabled/conteneva un link simbolico al file mysite. Da qualche tempo la modifica del file mysite non ha avuto alcun effetto. Per esempio. cambiare tutte le posizioni per "negare tutto" non ha avuto alcun effetto. I file sono stati inviati senza problemi.
Quindi ho rimosso il collegamento simbolico e riavviato il server. Quindi ho creato nuovamente il link simbolico, riavviato il server e tutto funziona come previsto. Qualcuno può spiegare il comportamento strano?

riguarda Gest,
Biggie

risposta

-1

è necessario rimuovere la seguente riga:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
+1

Questa è una linea necessaria quando php-fpm è in esecuzione in un chroot jail. – Zenexer

1

Questa è una vecchia questione, ma ho appena avuto lo stesso problema, quindi ecco la spiegazione.

Nginx utilizza the rules described in the docs per abbinare i blocchi di localizzazione. Per i blocchi convenzionali, la corrispondenza più lunga sarà quella che verrà applicata, ma per le espressioni regolari è il primo blocco corrispondente che verrà applicato.

Nel server di produzione, è probabile che il blocco location ~ \.php$ sia sopra il blocco di amministrazione, quindi il blocco di ascolti che hai pubblicato non è mai stato applicato.

Lunga storia breve: quando si tratta di un'espressione regolare ascoltare blocchi di nginx, le questioni di ordine. Metti le partite più specifiche prima di quelle generali.

12

Con questa configurazione, nginx corrisponderà solo a uno dei dei due blocchi, quello con la precedenza più alta.

La soluzione è combinare il blocco PHP nel blocco AUTH. Questo è l'approccio raccomandato dallo stesso autore di 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

esiste un modo per evitare l'ovvia duplicazione del codice? – peedee

+0

Inserisci il codice duplicato in un file separato e includilo da ciascun blocco. – fisharebest

-1

Forse ti sei dimenticato di aggiungere root:

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

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