htaccess excluye una URL de Basic Auth

Necesito excluir una Url (o incluso mejor un prefijo) de la protección de autenticación básica de htaccess normal. Algo así como / devoluciones de llamada / myBank o / devoluciones de llamada /. * ¿Tiene alguna pista de cómo hacerlo?

Lo que no estoy buscando es cómo excluir un archivo. Esto tiene que ser url (ya que esta es una solución basada en el marco PHP, y todas las URL se redirigen con mod_rewrite a index.php). Por lo tanto, no hay ningún archivo debajo de esta url. Nada.

Algunas de esas URL son solo devoluciones de llamada de otros servicios (no se conoce ninguna IP, por lo que no puedo excluirlas en función de la IP) y no pueden solicitar Usuario / Contraseña.

La definición actual es tan simple como:

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

Si está utilizando Apache 2.4, las soluciones temporales SetEnvIf y mod_rewrite ya no son necesarias ya que la directiva Require puede interpretar expresiones directamente:

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

Apache 2.4 trata las directivas Require que no están agrupadas por como si estuvieran en un , que se comporta como una instrucción “o”. Aquí hay un ejemplo más complicado que demuestra que coinciden tanto el URI de solicitud como la cadena de consulta, y que se recurre a la necesidad de un usuario válido:

 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  

Este ejemplo permitiría el acceso a /callbacks/foo?secret_var=42 pero requiere un nombre de usuario y contraseña para /callbacks/foo .

Recuerde que a menos que use , Apache intentará hacer coincidir cada Require en orden, así que piense primero en qué condiciones desea permitir.

La referencia para la directiva Require está aquí: https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require

Y la referencia de exprés está aquí: https://httpd.apache.org/docs/2.4/expr.html

Con SetEnvIf , puede crear una variable cuando la solicitud comienza con alguna ruta, luego use la directiva Satisfy Any para evitar tener que iniciar sesión.

 # 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 

El bloque permitir / denegar de las directivas indica que se niega el acceso a TODOS , excepto cuando hay un usuario válido (inicio de sesión de autenticación BASIC satisfactorio) o si se establece la variable noauth .

Esta solución funciona bastante bien, solo necesita definir la lista blanca por la que desea pasar.

 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 

Probé las otras soluciones, pero esto es lo que funcionó para mí. Con suerte será de ayuda para otros.

 # 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 

Esto permitirá que la API y cualquier cadena de URL después de /index.php/api/ abra sin tener que iniciar sesión y se pedirá a cualquier otra cosa que inicie sesión.

Ejemplo:

mywebsite.com/index.php/api se abrirá sin que se solicite el inicio de sesión mywebsite.com/index.php/api/soap/?wsdl=1 se abrirá sin que se solicite el inicio de sesión Se solicitará a mywebsite.com que inicie sesión primero

Otro enfoque funciona así, si el área que está protegiendo tiene un script PHP monolítico que controla todo, como WordPress. Configure Autenticación con en un directorio diferente. Coloque allí un index.php que establezca una cookie en la ruta ‘/’. Luego, en WordPress (por ejemplo), verifique la cookie, pero saltee la verificación si $ _SERVER [‘REQUEST_URI’] es la URL excluida.

En mi plataforma de alojamiento compartido, RewriteRule no pudo establecer una variable de entorno que funcionó con “Satisfy any”.

Con cualquier enfoque, tenga en cuenta que la página que está protegiendo no incluye imágenes, hojas de estilo, etc., que activan una solicitud de autenticación cuando la página no lo hace.

  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  

Agregue el código siguiente a su archivo htaccess raíz y no olvide cambiar su url de administrador, página de archivo .htpasswd.

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

Cree el archivo .htpasswd en su carpeta raíz y agregue debajo el nombre de usuario y la contraseña (configure el nombre de usuario predeterminado: admin y contraseña: admin123)

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

Por favor, avíseme si aún enfrenta algún problema.

¿Por qué no solo usas autenticación básica de la manera en que fue diseñada?

 user:password@domain.com/callbacks/etc