Come utilizzare un percorso RELATIVO con AuthUserFile in htaccess?


98

Ho un .htaccess che utilizza l'autenticazione di base. Sembra che il percorso del file .htpasswd non sia relativo al file htaccess, ma invece alla configurazione del server.

Quindi, anche se ho i file .htaccess e .htpasswd nella stessa directory, questo non funziona:

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

Tuttavia, funziona se cambio AuthUserFile per utilizzare il percorso assoluto:

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

Ma preferirei qualcosa di più mobile poiché lo uso su più siti in aree diverse. Ho cercato sul Web ma non ho avuto alcuna soluzione. È possibile utilizzare il percorso relativo o variabili come %{DOCUMENT_ROOT}?

Risposte:


51

Non è possibile utilizzare percorsi relativi per AuthUserFile :

File-path è il percorso del file utente. Se non è assoluto (cioè, se non inizia con una barra), viene considerato relativo a ServerRoot.

Devi accettare e aggirare questa limitazione.


Stiamo usando IfDefineinsieme a un parametro della riga di comando apache2 :

.htaccess (adatto sia per sistemi di sviluppo che live):

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

Configurazione del server di sviluppo (Debian)

Aggiungi quanto segue a /etc/apache2/envvars:

export APACHE_ARGUMENTS=-Ddevelopment

Riavvia il tuo apache in seguito e riceverai una richiesta di password solo quando non sei sul server di sviluppo.

Ovviamente puoi aggiungere un altro IfDefine per il server di sviluppo, basta copiare il blocco e rimuovere il file !.


4
Ma questo usa ancora un percorso assoluto ( /var/...) - e la domanda chiede: "come usare un percorso relativo"?
sdaau

1
E poi la domanda è stata modificata per rispondere correttamente con un "no" :)
Erenor Paz

15

Nel caso in cui le persone stiano cercando una soluzione per questo:

<If "req('Host') = 'www.example.com'">
    Authtype Basic
    AuthName "user and password"
    AuthUserFile /var/www/www.example.com/.htpasswd
    Require valid-user
</If>

1
Sarebbe fantastico, ma è sicuro fare affidamento req('Host'), il cliente non può ingannare questo valore?
Marco Demaio

1
@MarcoDemaio Sì, può / potrebbe essere ingannato utilizzando, ad esempio, l'indirizzo IP. Dipende dalla tua configurazione. Non è un sì o un no assoluto. Dipende.
Maxime

12

1) Notare che è considerato insicuro avere il .htpasswdfile sotto la radice del server.

2) I documenti dicono questo sui percorsi relativi, quindi sembra che tu sia sfortunato:

File-path è il percorso del file utente. Se non è assoluto (cioè, se non inizia con una barra), viene trattato come relativo a ServerRoot .

3) Mentre le risposte che raccomandano l'uso delle variabili d'ambiente funzionano perfettamente, preferirei mettere un segnaposto nel .htaccessfile, o avere versioni differenti nella mia base di codice, e fare in modo che il processo di distribuzione imposti tutto (cioè sostituire i segnaposto o rinominare / spostare il file appropriato).

Sui progetti Java, utilizzo Maven per fare questo tipo di lavoro, ad esempio su progetti PHP, mi piace avere uno script di shell build.sh e / o install.sh che ottimizza i file distribuiti per il loro ambiente. Questo disaccoppia la tua base di codice dalle specifiche del suo ambiente di destinazione (cioè le sue variabili di ambiente e parametri di configurazione). In generale, l'applicazione dovrebbe adattarsi all'ambiente, se lo fai al contrario, potresti incorrere in problemi una volta che l'ambiente deve anche soddisfare applicazioni diverse o requisiti specifici del sistema completamente non correlati.


8

puoi mettere le tue impostazioni di autenticazione in un ambiente. Piace:

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>

L'autenticazione funziona, ma non sono riuscito a far funzionare davvero il mio ambiente.


1
Penso che il problema sia questo: "Solo le variabili di ambiente definite dalle precedenti direttive SetEnvIf [NoCase] ​​sono disponibili per il test in questo modo." Precedentemente "significa che erano state definite in un ambito più ampio (come a livello di server) o precedentemente in il campo di applicazione dell'attuale direttiva ". (trovato qui: askapache.com/htaccess/setenvif.html ) Poiché hai lo stesso ambito, non puoi far funzionare il tuo ambiente.
user470370

4
perché questo non funziona è eccezionalmente buono spiegato qui stackoverflow.com/questions/11073752/...
nico Gawenda

Ma questo usa ancora un percorso assoluto ( /Users/...) - e la domanda chiede: "come usare un percorso relativo"?
sdaau

Sì. È tuttavia possibile utilizzare più impostazioni APPLICATION_ENV per utilizzare più percorsi assoluti per ambiente.
digitaldonkey

5

.htpasswd richiede il percorso assoluto completo dalla radice assoluta del server.

Si prega di ottenere il percorso assoluto completo del file tramite echo echo $_SERVER['DOCUMENT_ROOT'];.

qui funziona lo script di autenticazione .htaccess di base.

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

Prima del login

inserisci qui la descrizione dell'immagine

Accesso dopo

inserisci qui la descrizione dell'immagine


3

Se stai cercando di utilizzare XAMPP con Windows e desideri utilizzare un file .htaccess su un server live e anche sviluppare su una macchina di sviluppo XAMPP, quanto segue funziona alla grande!


1) Dopo una nuova installazione di XAMPP assicurati che Apache sia installato come servizio.

  • Questo viene fatto aprendo il pannello di controllo XAMPP e facendo clic sulla piccola "X" rossa a sinistra del modulo Apache.
  • Ti chiederà quindi se desideri installare Apache come servizio.
  • Quindi dovrebbe trasformarsi in un segno di spunta verde.

2) Quando Apache è installato come servizio, aggiungere una nuova variabile d'ambiente come flag.

  • Prima interrompi il servizio Apache dal pannello di controllo XAMPP.
  • Quindi apri un prompt dei comandi. (Conosci la piccola finestra nera che simula il DOS)
  • Digita "C: \ Programmi (x86) \ xampp \ apache \ bin \ httpd.exe" -D "DEV" -k config .
  • Ciò aggiungerà un nuovo flag DEV alle variabili di ambiente che potrai utilizzare in seguito.

3) Avvia Apache

  • Apri il backup del pannello di controllo XAMPP e avvia il servizio Apache.

4) Crea il tuo file .htaccess con le seguenti informazioni ...

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

Per spiegare lo script sopra, ecco alcune note ...

  • Il mio AuthUserFile si basa sulla mia configurazione e sulle preferenze personali.
  • Ho una casella di sviluppo di test locale che ha la mia pagina web situata in c: \ sandbox \ web \ . All'interno di quella cartella ho una cartella chiamata scripts che contiene il file delle password .htpasswd .
  • La prima voce IfDefine DEV viene utilizzata per quell'istanza . Se DEV è impostato (che è quello che abbiamo fatto sopra, solo sulla macchina di sviluppo di grossolano), allora utilizzerà quella voce.
  • E a sua volta, se si utilizza il server live, verrà utilizzato IfDefine! DEV .

5) Crea il tuo file di password (in questo caso chiamato .htpasswd) con le seguenti informazioni ...

utente: $ apr1 $ EPuSBcwO $ / KtqDUttQMNUa5lGXSOzk.

Alcune cose da notare ...


Ma questo usa ancora un percorso assoluto ( /home...) - e la domanda chiede: "come usare un percorso relativo"?
sdaau

2

o se sviluppi su localhost (solo per apache 2.4+):

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

1

So che questa è una vecchia domanda, ma ho cercato la stessa cosa e probabilmente ce ne sono molti altri alla ricerca di una soluzione rapida e mobile. Ecco cosa mi viene in mente finalmente:

# 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>

Ma questo usa ancora un percorso assoluto ( /var...) - e la domanda chiede: "come usare un percorso relativo"?
sdaau

1
Sì, è una soluzione alternativa, perché Apache non supporta i percorsi relativi alla posizione del .htaccessfile. Se dovessi utilizzare un percorso relativo, verrebbe considerato relativo a ServerRoot.
ovi

1

Facciamo un esempio.

La tua applicazione si trova in / var / www / myApp su alcuni server Linux

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

htpasswdApp : / var / www / miaApp / htpasswdApp . (Sei libero di usare qualsiasi nome per il file .htpasswd )

Per utilizzare il percorso relativo in .htaccess :

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

Ma cercherà il file nella directory server_root . Non in document_root .

Nel nostro caso, quando l'applicazione si trova in / var / www / myApp :

document_root IS / var / www / myApp

server_root è / etc / apache2 // (solo nel nostro esempio, poiché utilizziamo il server linux )

Puoi ridefinirlo nel tuo file di configurazione di apache ( /etc/apache2/apache2.conf ), ma immagino che sia una cattiva idea.

Quindi, per utilizzare il percorso del file relativo nel tuo /var/www/myApp/.htaccess devi definire il file della password nel tuo server_root .

Preferisco farlo seguendo il comando:

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

Sei libero di copiare il mio comando, utilizzare un collegamento fisico invece del simbolo o copiare un file nel tuo server_root .


1
poiché apache blocca l'accesso ai file che iniziano con .ht * per impostazione predefinita, non è consigliabile utilizzare nomi casuali per essi.
cari
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.