condicionais htaccess
-
29-09-2020 - |
Pergunta
Configurei a autenticação htpasswd em meu site ativo e funciona muito bem, mas não quero que uma senha seja solicitada quando estiver trabalhando no ambiente de desenvolvimento.
No meu arquivo httpd.conf eu tenho:
SetEnv APP_ENV "development"
No meu .htaccess
arquivo que tenho:
AuthName "Restricted Area"
AuthType Basic
AuthUserFile /path/to/file/.htpasswd
AuthGroupFile /dev/null
require valid-user
Eu queria saber se havia alguma maneira de colocar uma condicional em torno do material htppasswd para que quando APP_ENV
é development
que não seja solicitada uma senha.
Isso é possível?
Solução
Se você puder, você deve pensar em atualizar para Apache 2.4 (ou a versão beta 2.3 mais recente, já que a 2.4 ainda não foi lançada).
Uma das novidades disponíveis é Contêineres de autorização - tornando muito mais simples definir requisitos de acesso usando o Exigir diretiva.
Você deve terminar com algo como:
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>
Outras dicas
Uma das maneiras de construir blocos condicionais if com variáveis env é usar mod_macro módulo.Eu fiz um exemplo anteriormente aqui.
Neste caso específico você teria no topo do arquivo VirtualHost (antes da definição do 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 do Virtualhost:
Use ConditionalBlockMacroSecurity_${APP_ENV}
onde o caminho para o arquivo htpassword também pode ser definido como um parâmetro da macro.
A desvantagem desta solução é que você precisa instalar o mod_macro no servidor de produção, não é um módulo comumente instalado e você precisará de algum controle do ambiente de produção para fazer isso.Por outro lado, uma solução simples é ter várias versões de seus virtualhosts dependendo do ambiente, e adicionar alguns comentários na seção Auth.Mas se você está procurando uma solução genérica, certamente significa que é um problema recorrente e deseja evitar a edição manual de arquivos, nesses casos o mod_macro pode se tornar uma forma muito profissional de capitalizar suas experiências com o apache, até que suas configurações do apache se tornem uma única macro com parâmetros, chamando muitas outras macros.
Condicionais na configuração do Apache funcionam apenas uma vez, quando a configuração é [re]carregada.
O que eu faria é criar um segundo VirtualHost com o mesmo diretório raiz e controlar o acesso usando Negar/Permitir com base no endereço IP.
Adicione o seguinte:
Require valid-user
Allow from <dev IP>
Satisfy Any
Isso exigirá que Require valid-user
ou Allow from <dev IP>
se aplica.
Na tua .htaccess
arquivo você pode aninhar os blocos dentro da diretiva IfDefine, como:
<IfDefine PROD>
bla bla bla
</IfDefine>
Então certifique-se de passar -D PROD
como argumento quando você inicia o Apache.Esta seção só seria executada se PROD estivesse definido.No Ubuntu você pode fazer isso, por exemplo, editando /etc/apache2/envvars
e adicionando esta linha no final:
export APACHE_ARGUMENTS="-D PROD"
Você pode "inverter" talvez usando algo como <IfDefine !DEV>
para executar apenas quando não for o ambiente de desenvolvimento e, em seguida, passar -D DEV nesse ambiente e deixar os sites de produção como estão, sem precisar editar os envvars.
Modifique de acordo com suas necessidades!