2010-07-26 17 views
7

Ho installato l'autenticazione htpasswd sul mio sito live e funziona benissimo, ma non mi viene richiesta una password quando lavoro sull'ambiente di sviluppo.htaccess conditionals

Nel mio file httpd.conf ho:

SetEnv APP_ENV "development" 

Nel mio file .htaccess ho:

AuthName "Restricted Area" 
AuthType Basic 
AuthUserFile /path/to/file/.htpasswd 
AuthGroupFile /dev/null 
require valid-user 

mi chiedevo se ci fosse comunque di mettere un condizionale intorno la roba htppasswd così che quando APP_ENV è development che non viene richiesta una password.

È possibile?

risposta

6

Se si è in grado, si dovrebbe pensare di aggiornare a Apache 2.4 (o l'ultima versione beta 2.3 dal 2,4 non è ancora abbastanza rilasciato).

Una delle nuove funzionalità disponibili è Authorization Containers - rendendo molto più semplice la definizione dei requisiti di accesso mediante la direttiva Require.

Si dovrebbe finire con qualcosa di simile:

AuthName "Restricted Area" 
AuthType Basic 
AuthUserFile /path/to/file/.htpasswd 
AuthGroupFile /path/to/file/groups 

SetEnv APP_ENV "development" 

<RequireAll> 
    <RequireAny> 
    <RequireAll> 
     #main requirements 
     Require group user 
     #other conditions if needed for non-dev/non-local 
    </RequireAll> 

    <RequireAll> 
     #allow direct if development 
     Require env APP_ENV development 
    </RequireAll> 

    <RequireAll> 
     <RequireAny> 
     #allow loopback and local network 
     Require ip 127.0.0.1 
     Require ip 10.2 
     </RequireAny> 
    </RequireAll> 
    <RequireAny> 

    #other conditions if needed for everyone 

    <RequireNone> 
    #blacklist 
    </RequireNone> 
</RequireAll> 
2

Le condizioni nella configurazione di Apache funzionano una sola volta, quando la configurazione viene [re] caricata.

Quello che vorrei fare è creare un secondo VirtualHost con la stessa directory root e controllare l'accesso usando Deny/Allow in base all'indirizzo IP lì.

2

Aggiungere il seguente:

Require valid-user 
Allow from <dev IP> 
Satisfy Any 

Ciò richiederà che Require valid-useroAllow from <dev IP> applica.

+0

Ciò funzionerebbe, ma devo usare "Soddisfa tutto" a causa di altri vincoli. – gpojd

+0

@gpojd sarà possibile per te postare l'intera configurazione? – zrvan

+0

Purtroppo, non sono in grado di postarlo. Il mio .htaccess è simile a quello degli OP, ma limito anche l'indirizzo IP e "Soddisfa tutto". – gpojd

3

Uno dei modi di costruire se i blocchi condizionali con variabili env utilizzano il modulo mod_macro. Ho fatto un esempio in precedenza here.

In questo caso particolare si avrebbe sulla parte superiore del file VirtualHost (prima della definizione VirtualHost):

<Macro ConditionalBlockMacroSecurity_production> 
    AuthName "Restricted Area" 
    AuthType Basic 
    AuthUserFile /path/to/file/.htpasswd 
    AuthGroupFile /dev/null 
    require valid-user 
</Macro> 
<Macro ConditionalBlockMacroSecurity_development > 
    <IfModule mod_headers.c> 
     Header set MyHeader "Hello this is DEVELOPMENT envirronment. It took %D microseconds for Apache to serve this request." 
    </IfModule> 
</Macro> 

E dentro la Virtualhost:

Use ConditionalBlockMacroSecurity_${APP_ENV} 

dove percorso del file htpassword potrebbe anche essere impostato come parametro della macro.

Lo svantaggio di questa soluzione è che è necessario installare mod_macro sul server di produzione, non è un modulo comunemente installato e per farlo è necessario un certo controllo dell'env di produzione. D'altra parte, una soluzione semplice è avere diverse versioni dei tuoi virtualhosts a seconda dell'ambiente, e aggiungere alcuni commenti nella sezione Auth. Ma se stai cercando una soluzione generica sicuramente significa che è un problema ricorrente e vuoi evitare la modifica manuale dei file, in questi casi mod_macro può diventare un modo molto professionale di capitalizzare le tue esperienze di apache, fino a quando le tue configurazioni di apache diventeranno un'unica macro con parametri, chiamando molte altre macro.

0

Nel file .htaccess è possibile nido i blocchi all'interno della direttiva IfDefine, come:

<IfDefine PROD> 
    bla bla bla 
</IfDefine> 

quindi assicurarsi di passare -D PROD come argomento quando inizi apache. Questa sezione verrà eseguita solo se viene definito PROD. In Ubuntu è possibile fare questo, ad esempio, la modifica di /etc/apache2/envvars e l'aggiunta di questa riga alla fine:

export APACHE_ARGUMENTS="-D PROD" 

È possibile "inversa", facendo magari usando qualcosa come <IfDefine !DEV> per eseguire solo quando il suo non è l'ambiente di sviluppo, quindi passare -D DEV in quell'ambiente e lasciare i siti di produzione come sono senza dover modificare envvars.

Modificare di conseguenza in base alle proprie esigenze!