htaccess esclude un url da Basic Auth

Devo escludere un Url (o anche un prefisso migliore) dalla normale protezione di autenticazione di base htaccess. Qualcosa come / callback / myBank o / callback /. * Hai qualche suggerimento su come farlo?

Quello che non sto cercando è come escludere un file. Questo deve essere url (dato che questa è una soluzione basata su framework PHP, e tutti gli URL sono reindirizzati con mod_rewrite a index.php). Quindi non ci sono file sotto questo URL. Niente.

Alcuni di questi URL sono solo richiamate da altri servizi (nessun IP non è noto quindi non posso escluderlo in base all’IP) e non possono richiedere Utente / Password.

La definizione attuale è semplice come:

AuthName "Please login." AuthGroupFile /dev/null AuthType Basic AuthUserFile /xxx/.htpasswd require valid-user 

Se stai usando Apache 2.4, SetEnvIf e mod_rewrite i workaround non sono più necessari poiché la direttiva Require è in grado di interpretare direttamente le espressioni:

 AuthType Basic AuthName "Please login." AuthUserFile "/xxx/.htpasswd" Require expr %{REQUEST_URI} =~ m#^/callbacks/.*# Require valid-user 

Tratta Apache 2.4 Require direttive che non sono raggruppate da come se fossero in un , che si comporta come una “o” istruzione. Ecco un esempio più complicato che dimostra la corrispondenza tra l’URI della richiesta e la stringa della query insieme e ricade sul richiedere un utente valido:

 AuthType Basic AuthName "Please login." AuthUserFile "/xxx/.htpasswd"   # I'm using the alternate matching form here so I don't have # to escape the /'s in the URL. Require expr %{REQUEST_URI} =~ m#^/callbacks/.*# # You can also match on the query string, which is more # convenient than SetEnvIf. #Require expr %{QUERY_STRING} = 'secret_var=42'  Require valid-user  

Questo esempio consentirebbe l’accesso a /callbacks/foo?secret_var=42 ma richiede un nome utente e una password per /callbacks/foo .

Ricorda che, a meno che non usi , Apache proverà ad abbinare ogni Require in ordine, quindi pensa a quali condizioni vuoi consentire prima.

Il riferimento per la direttiva Require è qui: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

E il riferimento all’esprimione è qui: https://httpd.apache.org/docs/2.4/expr.html

Usando SetEnvIf , è ansible creare una variabile quando la richiesta inizia con un percorso, quindi utilizzare la direttiva Satisfy Any per evitare di dover effettuare il login.

 # set an environtment variable "noauth" if the request starts with "/callbacks/" SetEnvIf Request_URI ^/callbacks/ noauth=1 # the auth block AuthName "Please login." AuthGroupFile /dev/null AuthType Basic AuthUserFile /xxx/.htpasswd # Here is where we allow/deny Order Deny,Allow Satisfy any Deny from all Require valid-user Allow from env=noauth 

La sezione Consenti / Rifiuta di direttive afferma che negare l’accesso a TUTTI , tranne quando è presente un utente valido (accesso di autenticazione BASIC riuscito) o se è impostata la variabile noauth .

Questa soluzione funziona abbastanza bene, devi solo definire la whitelist che vuoi passare.

 SetEnvIfNoCase Request_URI "^/status\.php" noauth AuthType Basic AuthName "Identify yourself" AuthUserFile /path/to/.htpasswd Require valid-user Order Deny,Allow Deny from all Allow from env=noauth Satisfy any 

Ho provato le altre soluzioni ma questo è ciò che ha funzionato per me. Spero che sarà di aiuto agli altri.

 # Auth stuff AuthName "Authorized personnel only." AuthType Basic AuthUserFile /path/to/your/htpasswd/file SetEnvIf Request_URI "^/index.php/api/*" allow Order allow,deny Require valid-user Allow from env=allow Deny from env=!allow Satisfy any 

Ciò consentirà di aprire l’URL api e qualsiasi stringa di URL dopo /index.php/api/ senza dover effettuare l’accesso e qualsiasi altra cosa verrà richiesta per accedere.

Esempio:

mywebsite.com/index.php/api si aprirà senza che venga richiesto di accedere mywebsite.com/index.php/api/soap/?wsdl=1 si aprirà senza che venga richiesto di accedere a mywebsite.com verrà richiesto di accedere prima

Un altro approccio funziona in questo modo, se l’area che stai proteggendo ha uno script PHP monolitico che controlla tutto, come WordPress. Configura l’autenticazione con una diversa directory. Metti un index.php lì che imposta un cookie sul percorso ‘/’. Quindi, in WordPress (ad esempio), controlla il cookie, ma ignora il controllo se $ _SERVER [‘REQUEST_URI’] è l’URL escluso.

Sulla mia piattaforma di hosting condiviso, RewriteRule non ha potuto impostare una variabile d’ambiente che funzionasse con “Satisfy any”.

Con qualsiasi approccio, fai attenzione che la pagina che stai proteggendo non include immagini, fogli di stile, ecc., Che triggersno una richiesta di autenticazione quando la pagina stessa non lo fa.

  SetEnvIf Request_URI "/callback/.*" REDIRECT_noauth=1 AuthType Basic AuthName "Restricted Files" AuthUserFile /etc/httpd/passwords/passwords Order Deny,Allow Satisfy any Deny from all Allow from env=REDIRECT_noauth Require user yournickname  

Aggiungi sotto il codice al tuo file htaccess di root e non dimenticare di cambiare la tua URL di amministrazione, la pagina del file .htpasswd.

  AuthName "Cron auth" AuthUserFile E:\wamp\www\mg\.htpasswd AuthType basic Require valid-user  

Crea il file .htpasswd nella tua cartella principale e aggiungi sotto username e password (imposta nome utente predefinito: admin e password: admin123)

 admin:$apr1$8.nTvE4f$UirPOK.PQqqfghwANLY47. 

Per favore fatemi sapere se avete ancora problemi.

perché non usi semplicemente l’autenticazione di base come è stata concepita?

 user:[email protected]/callbacks/etc