2013-06-10 25 views
23

Sommario: Il mod_proxy di Apache 2.4 non sembra passare le intestazioni di autorizzazione a PHP-FPM. C'è un modo per risolvere questo problema?Apache 2.4 + PHP-FPM e intestazioni di autorizzazione

Versione lunga: Sto eseguendo un server con Apache 2.4 e PHP-FPM. Sto usando APC sia per il caching opcode che per il caching utente. Come raccomandato da Internet, io sto usando Apache 2.4 di mod_proxy_fcgi per delega le richieste a FPM, in questo modo:

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/foo/bar/$1 

La messa a punto funziona bene, tranne una cosa: apc.php bundle di APC, utilizzato per monitorare il lo stato di APC non mi consente di accedere (necessario per guardare le voci della cache dell'utente). Quando faccio clic su "Voci cache utente" per vedere la cache utente, mi chiede di accedere, facendo clic sul pulsante di accesso viene visualizzato il solito modulo di accesso HTTP, ma inserendo il login e la password corretti non si ottiene alcun risultato. Questa funzione funziona perfettamente quando si esegue con mod_php invece di mod_proxy + php-fpm.

Dopo aver cercato su Google ho scoperto che altre persone avevano lo stesso problema e capito che era perché Apache non stava passando le intestazioni HTTP di autorizzazione al processo FastCgi esterno. Purtroppo ho trovato solo una correzione per mod_fastcgi, che si presentava così:

FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -host 127.0.0.1:9000 -pass-header Authorization 

C'è un'impostazione equivalente o qualche soluzione alternativa che avrebbe anche lavorare con mod_proxy_fcgi?

+0

Grazie per lo snippet "-pass-header Authorization"! Mi ha aiutato fuori w/fastcgi. – Sergio

risposta

57

Vari moduli Apache elimineranno l'intestazione Authorization, in genere per "motivi di sicurezza". Tutti hanno impostazioni oscure diverse che è possibile modificare per annullare questo comportamento, ma è necessario determinare esattamente quale modulo è da incolpare.

È possibile aggirare il problema facendo passare l'intestazione direttamente a PHP tramite l'ENV:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 

Vedi anche Zend Server Windows - Authorization header is not passed to PHP script

+1

Questo ha fatto il trucco, grazie! – CodeTwice

+4

Questo potrebbe aiutare gli utenti di PHP 5.5+ e Apache 2.4. Dopo aver aggiunto Autorizzazione SetEnvIf "(. *)" HTTP_AUTHORIZATION = $ 1 al file .htaccess è necessario utilizzare $ _SERVER ['REDIRECT_HTTP_AUTHORIZATION'] variabile invece di $ _SERVER ['HTTP_AUTHENTICATION']. – Rahi

+0

dove aggiungi questo = ¿? –

0

Non ho trovato impostazioni simili con mod_proxy_fcgi, MA funziona solo per impostazione predefinita. Richiede l'autorizzazione dell'utente (.htaccess come al solito) e il php lo ottiene, e funziona come con mod_php o fastcgi e pass-header. Non so se mi è stato d'aiuto ...

MODIFICA: funziona solo su teszt.com/ quando si utilizza DirectoryIndex ... Se si passa il nome del file php (anche se index.php!) semplicemente non funziona, non passare l'auth al php. Questo è un blocco per me, ma non voglio effettuare il downgrade ad apache 2.2 (e mod_fastgi), quindi migrerò su nginx (anche su questa macchina).

19

Questo mi c'è voluto molto tempo per rompere, poiché non è documentato in mod_proxy o mod_proxy_fcgi.

aggiungere la seguente direttiva al conf apache o .htaccess:

CGIPassAuth on 

Vedi here per i dettagli.

+1

Nota: funziona solo su Apache 2.4.13 o successive, cioè non su alcuna versione di Ubuntu a partire da 15.10. –

+0

Questa soluzione ha più senso in quanto è più vicino alla impostazione proxy che le intestazioni auth disabile di passaggio, vale a dire: SetHandler "proxy: fcgi: //127.0.0.1: 9000" CGIPassAuth su – Julz