Como usar um caminho RELATIVO com AuthUserFile no htaccess?

98

Eu tenho um .htaccess que usa autenticação básica. Parece que o caminho para o arquivo .htpasswd não é relativo ao arquivo htaccess, mas sim à configuração do servidor.

Portanto, embora eu tenha os arquivos .htaccess e .htpasswd no mesmo diretório, isso não funciona:

AuthType Basic
AuthName "Private Login"
AuthUserFile .htpasswd
Require valid-user

No entanto, funcionará se eu alterar o AuthUserFile para usar o caminho absoluto:

AuthType Basic
AuthName "Private Login"
AuthUserFile "/home/user/public_html/mydir/.htpasswd"
Require valid-user

Mas eu preferiria algo mais móvel, pois uso isso em vários sites em áreas diferentes. Pesquisei na web, mas não encontrei nenhuma resolução. É possível usar caminho relativo ou variáveis ​​como %{DOCUMENT_ROOT}?

DssTrainer
fonte

Respostas:

51

Não é possível usar caminhos relativos para AuthUserFile :

Caminho do arquivo é o caminho para o arquivo do usuário. Se não for absoluto (ou seja, se não começar com uma barra), será tratado como relativo ao ServerRoot.

Você tem que aceitar e contornar essa limitação.


Estamos usando IfDefinejunto com um parâmetro de linha de comando apache2 :

.htaccess (adequado para sistemas de desenvolvimento e ao vivo):

<IfDefine !development>
  AuthType Basic
  AuthName "Say the secret word"
  AuthUserFile /var/www/hostname/.htpasswd
  Require valid-user
</IfDefine>

Configuração do servidor de desenvolvimento (Debian)

Anexe o seguinte a /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Reinicie o apache depois disso e você receberá um prompt de senha apenas quando não estiver no servidor de desenvolvimento.

É claro que você pode adicionar outro IfDefine para o servidor de desenvolvimento, basta copiar o bloco e remover o !.

Cweiske
fonte
4
Mas isso ainda usa um caminho absoluto ( /var/...) - e a questão pergunta: "como usar um caminho relativo"?
sdaau
1
E então a questão foi editada para responder corretamente com um "não" :)
Erenor Paz 16/08/16
15

Caso as pessoas estejam procurando uma solução para isso:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>
mask8
fonte
1
Isso seria ótimo, mas é seguro confiar req('Host'), o cliente não pode enganar esse valor?
Marco Demaio
1
@MarcoDemaio Sim, pode / poderia ser enganado usando, por exemplo, o endereço IP. Depende da sua configuração. Não é um sim ou não absoluto. Depende.
Máximo
12

1) Observe que é considerado inseguro ter o .htpasswdarquivo abaixo da raiz do servidor.

2) Os documentos dizem isso sobre caminhos relativos, então parece que você está sem sorte:

Caminho do arquivo é o caminho para o arquivo do usuário. Se não for absoluto (ou seja, se não começar com uma barra), será tratado como relativo ao ServerRoot .

3) Embora as respostas recomendando o uso de variáveis ​​de ambiente funcionem perfeitamente bem, eu preferiria colocar um marcador de posição no .htaccessarquivo, ou ter versões diferentes em minha base de código, e ter o processo de implantação configurando tudo (ou seja, substituir marcadores de posição ou renomear / mover o arquivo apropriado).

Em projetos Java, eu uso o Maven para fazer este tipo de trabalho, digamos, em projetos PHP, gosto de ter um script de shell build.sh e / ou install.sh que ajusta os arquivos implantados em seu ambiente. Isso separa sua base de código das especificações de seu ambiente de destino (ou seja, suas variáveis ​​de ambiente e parâmetros de configuração). Em geral, o aplicativo deve se adaptar ao ambiente; se você fizer isso ao contrário, poderá ter problemas, uma vez que o ambiente também deve atender a diferentes aplicativos ou a requisitos específicos do sistema completamente não relacionados.

Hanno Fietz
fonte
8

você pode colocar suas configurações de Auth em um ambiente. Gostar:

SetEnvIf HTTP_HOST testsite.local APPLICATION_ENV=development
<IfDefine !APPLICATION_ENV>
  Allow from all
  AuthType Basic
  AuthName "My Testseite - Login" 
  AuthUserFile /Users/tho/htdocs/wgh_staging/.htpasswd
  Require user username
</IfDefine>

O Auth está funcionando, mas não consegui fazer meu ambiente realmente funcionar.

digitaldonkey
fonte
1
Acho que o problema é o seguinte: "Apenas as variáveis ​​de ambiente definidas pelas diretivas SetEnvIf [NoCase] ​​anteriores estão disponíveis para teste desta maneira. 'Anterior' significa que foram definidas em um escopo mais amplo (como em todo o servidor) ou anteriormente em âmbito da diretiva atual. " (encontrado aqui: askapache.com/htaccess/setenvif.html ) Por ter o mesmo escopo, não era possível colocar o ambiente em execução.
user470370
4
porque isso não está funcionando é excepcionalmente bom explicado aqui stackoverflow.com/questions/11073752/…
nico gawenda
Mas isso ainda usa um caminho absoluto ( /Users/...) - e a questão pergunta: "como usar um caminho relativo"?
sdaau
Sim. Mas você pode usar várias configurações de APPLICATION_ENV para usar vários caminhos absolutos por ambiente.
digitaldonkey
5

.htpasswd requer um caminho absoluto completo da raiz absoluta do servidor.

Obtenha o caminho absoluto completo do arquivo por echo echo $_SERVER['DOCUMENT_ROOT'];.

aqui está funcionando o script de autenticação .htaccess básico.

AuthType Basic
AuthName "Access to the Hidden Files"
AuthUserFile 'C:/xampp/htdocs/ht/.htpasswd'
Require valid-user

Antes de entrar

insira a descrição da imagem aqui

Afetr Login

insira a descrição da imagem aqui

muni
fonte
3

Se você está tentando usar o XAMPP com Windows e deseja usar um arquivo .htaccess em um servidor ativo e também desenvolver em uma máquina de desenvolvimento XAMPP, o seguinte funciona muito bem!


1) Após uma nova instalação do XAMPP, certifique-se de que o Apache está instalado como um serviço.

  • Isso é feito abrindo o Painel de Controle do XAMPP e clicando no pequeno "X" vermelho à esquerda do módulo Apache.
  • Ele então perguntará se você deseja instalar o Apache como um serviço.
  • Em seguida, deve virar para uma marca de seleção verde.

2) Quando o Apache é instalado como um serviço, adicione uma nova variável de ambiente como um sinalizador.

  • Primeiro pare o serviço Apache no Painel de Controle do XAMPP.
  • Em seguida, abra um prompt de comando. (Você conhece a janelinha preta que simula o DOS)
  • Digite "C: \ Arquivos de programas (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config .
  • Isso acrescentará um novo sinalizador DEV às variáveis ​​de ambiente que você pode usar mais tarde.

3) Inicie o Apache

  • Abra o painel de controle do XAMPP e inicie o serviço Apache.

4) Crie seu arquivo .htaccess com as seguintes informações ...

<IfDefine DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/sandbox/web/scripts/.htpasswd"
  require valid-user
</IfDefine>

<IfDefine !DEV>
  AuthType Basic
  AuthName "Authorized access only!"
  AuthUserFile "/home/arvo/public_html/scripts/.htpasswd"
  require valid-user
</IfDefine>

Para explicar o script acima, aqui estão algumas notas ...

  • Meu AuthUserFile é baseado em minha configuração e preferências pessoais.
  • Tenho uma caixa de desenvolvimento de teste local que tem minha página da Web localizada em c: \ sandbox \ web \ . Dentro dessa pasta, tenho uma pasta chamada scripts que contém o arquivo de senha .htpasswd .
  • A primeira entrada IfDefine DEV é usada para essa instância. Se DEV estiver definido (que é o que fizemos acima, apenas na máquina de desenvolvimento de grosso), ele usará essa entrada.
  • E por sua vez, se estiver usando o servidor ao vivo IfDefine! DEV será usado.

5) Crie seu arquivo de senha (neste caso denominado .htpasswd) com as seguintes informações ...

usuário: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Algumas coisas a serem observadas ...

Arvo Bowen
fonte
Mas isso ainda usa um caminho absoluto ( /home...) - e a questão pergunta: "como usar um caminho relativo"?
sdaau
2

ou se você desenvolve em localhost (apenas para apache 2.4+):

<If "%{REMOTE_ADDR} != '127.0.0.1'">
</If>
amxm
fonte
1

Sei que essa é uma pergunta antiga, mas acabei de pesquisar a mesma coisa e provavelmente há muitos outros procurando por uma solução rápida e móvel. Aqui está o que eu finalmente descobri:

# We set production environment by default
SetEnv PROD_ENV 1

<IfDefine DEV_ENV>
  # If 'DEV_ENV' has been defined, then unset the PROD_ENV
  UnsetEnv PROD_ENV

  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /var/www/foo.local/.htpasswd
  Require valid-user
</IfDefine>

<IfDefine PROD_ENV>
  AuthType Basic
  AuthName "Protected Area"
  AuthUserFile /home/foo/public_html/.htpasswd
  Require valid-user
</IfDefine>
Ovi
fonte
Mas isso ainda usa um caminho absoluto ( /var...) - e a questão pergunta: "como usar um caminho relativo"?
sdaau
1
Sim, é uma solução alternativa, porque o Apache não oferece suporte a caminhos relativos para a localização do .htaccessarquivo. Se você fosse usar um caminho relativo, ele seria considerado relativo ao ServerRoot.
Ovi
1

Vamos dar um exemplo.

Seu aplicativo está localizado em / var / www / myApp em algum servidor Linux

.htaccess : /var/www/myApp/.htaccess

htpasswdApp : / var / www / myApp / htpasswdApp . (Você pode usar qualquer nome para o arquivo .htpasswd )

Para usar o caminho relativo em .htaccess :

AuthType Digest
AuthName myApp
AuthUserFile "htpasswdApp"
Require valid-user

Mas ele irá procurar o arquivo no diretório server_root . Não em document_root .

Em nosso caso, quando o aplicativo está localizado em / var / www / myApp :

document_root é / var / www / myApp

server_root é / etc / apache2 // (apenas em nosso exemplo, por usarmos o servidor Linux )

Você pode redefini-lo em seu arquivo de configuração do apache ( /etc/apache2/apache2.conf ), mas acho que é uma má ideia.

Portanto, para usar o caminho relativo do arquivo em seu /var/www/myApp/.htaccess, você deve definir o arquivo de senha em seu server_root .

Eu prefiro fazer isso seguindo o comando:

sudo ln -s /var/www/myApp/htpasswdApp /etc/apache2/htpasswdApp

Você está livre para copiar meu comando, usar um link físico em vez de símbolo ou copiar um arquivo para seu server_root .

Sild
fonte
1
uma vez que o apache bloqueia o acesso a arquivos começando com .ht * por padrão, não é recomendado usar nomes aleatórios para eles.
cari