2012-04-22 15 views
21

Ésta es mi .htaccess:Apache .htaccess redirigir a HTTPS antes de solicitar la autenticación del usuario

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

AuthUserFile /etc/hi 
AuthName "hi" 
AuthType Basic 
require valid-user 

Se pide la autenticación del usuario mediante HTTP, lo que significa que la contraseña se envía en texto sin formato. Luego redirigirá a la versión https y pedirá la contraseña nuevamente.

¿Cómo puedo solucionarlo?

+2

Tienes que HTTP y HTTPS sitios declarados en las entradas de host virtuales separadas, de modo de configuración para uno no va a interferir con otro . Cuando termine, la regla de reescritura debe estar en http uno y auth en https one (Todo esto supone que usted accede al sitio solo a través de HTTPS). – LazyOne

Respuesta

8

Lo soluciono de esta manera. Simplemente permitan No SSL ya que será redirigido a continuación requieren autenticación SSL una vez en ...

SetEnvIf %{SERVER_PORT} ^80$ IS_NON_SSL 

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

AuthUserFile /etc/hi 
AuthName "hi" 
AuthType Basic 
require valid-user 
Allow from env=IS_NON_SSL 
+1

Solución elegante para un problema no del todo obvio. Terminé usando 'Allow from env =! HTTPS' donde HTTPS está configurado en solicitudes de SSL, pero se aplica el mismo concepto. Gracias. –

+1

SERVER_PORT no es una opción disponible en la directiva SetEnvIf según la documentación en http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#setenvif –

+4

Además, al menos en mi caso, las imágenes instantáneas solicitan autenticación dos veces. – LWC

9

Si se está utilizando Apache 2.4 se puede utilizar configuration sections para resolver esto con bastante facilidad.

Ej ...

# Redirect to HTTPS 
RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L] 

# Authenticate users only when using HTTPS 
# Enable for <v2.4 
# SSLRequireSSL 
# ErrorDocument 403 /secure-folder/ 
# Enable for >v2.4 
<If "%{HTTPS} == 'on'"> 
    AuthType Basic 
    AuthName "Special things" 
    AuthUserFile /etc/blah.htpasswd 
    # Prevent this 'Require' directive from overriding any merged previously 
    <IfVersion >= 2.4> 
     AuthMerging And 
    </IfVersion> 
    Require valid-user 
# Enable for >v2.4 
</If> 
+5

* Definitivamente no haga esto. * Debido a la orden de fusión de directivas ('' se fusiona al final), los usuarios autenticados tendrán acceso a cualquier archivo o directorio previamente bloqueado con '' o ''! Por ejemplo, en las configuraciones de servidor ordinarias, se otorgará acceso al archivo '.htaccess' para usuarios válidos. – alecov

+3

@ Alek, he agregado una directiva 'AuthMerging' que creo que resuelve el problema que planteaste. Por lo tanto, todos los visitantes siguen siendo redirigidos a HTTPS, pero cualquier solicitud HTTPS requiere que el visitante sea autenticado * además * de las restricciones existentes agregadas por las directivas o previamente fusionadas. ¿Qué piensas? – Molomby

+2

No probé esta configuración, pero parece estar bien en la documentación, por lo que voy a quitarle la palabra. – alecov

2

aplicación web de nuestro cliente se instala en su directorio webuser. La autorización se maneja antes de las reglas de mod_rewrite (https://serverfault.com/a/443185/253111), y no pudimos lograr que funcione la respuesta aceptada, por lo que mod_rewrite no parecía una opción.

Eventualmente requerimos explícitamente SSL y utilizamos la raíz de la aplicación web sobre HTTPS como documentos de error 403 y 404. Entonces, cuando uno visita cualquier página a través de HTTP (que no está autorizado, por lo tanto, el 403) o una página no existente (404), se le redirige a, por ejemplo. https://DOMAIN.TLD/~WEBUSER/admin.

Este es el archivo .htaccess con algo de información extra en los comentarios.

### INFO: Rewrites and redirects are handled after authorisation 
### @link https://serverfault.com/a/443185/253111 

### INFO: Log out of a HTPASSWD session 
### This was not always possible, but Firefox and Chrome seem to end sessions 
### when a new one is trying to be using ie.: 
### https://logout:[email protected]/~WEBUSER/ 
### @link http://stackoverflow.com/a/1163884/328272 

### FORCE SSL: Explicitly require the SSL certificate of a certain domain to 
### disallow unsigned certificates, etc. ErrorDocument commands are used to 
### redirect the user to an HTTPS URL. 
### @link http://forum.powweb.com/showthread.php?t=61566 
SSLOptions +StrictRequire 
SSLRequireSSL 
SSLRequire %{HTTP_HOST} eq "DOMAIN.TLD" 

### HTPASSWD AUTHENTICATION 
AuthUserFile /var/www/vhosts/DOMAIN.TLD/web_users/WEBUSER/.htpasswd 
AuthType Basic 
AuthName "Hello" 
Require valid-user 

### ERROR DOCUMENTS: Redirect user in case of a 403/404. 
ErrorDocument 403 https://DOMAIN.TLD/~WEBUSER/admin 
ErrorDocument 404 https://DOMAIN.TLD/~WEBUSER/admin 
+0

¿Por qué usted? necesita 'SSLRequire% {HTTP_HOST} eq" DOMAIN.TLD "'? ¿Para qué caso esto ayuda? Por cierto: SSLRequire se depreció https://httpd.apache.org/docs/current/mod/mod_ssl.html#sslrequire – Adam

1

solución de Molomby trabaja en 2.4 y superior, pero no funciona con la versión actual de Debian 2.2.22.

Las soluciones de Ben/Chris Heald tampoco me funcionaron en 2.2.22, pero eso se debió a una configuración diferente de orden/satisfacción. Estas configuraciones han cambiado con 2.4 y la solución parece ser incompatible con 2.4 y superior (el redireccionamiento funciona, pero el navegador solo muestra un error no autorizado sin pedir credenciales).

Aquí es una combinación de las dos soluciones que deben trabajar para las versiones debajo y por encima de 2,4:

RewriteEngine on 
RewriteOptions Inherit # rewrite rules from parent directories 
RewriteCond %{HTTPS} off 
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

AuthType Digest 
AuthName "private area" 
AuthDigestProvider file 
AuthUserFile /path/to/file/.htdigest 

<IfVersion < 2.4> 
    Order Deny,Allow 
    Deny from all 
    Satisfy Any # reset this to 'All' in custom <Files> and <Directory> directives that block access 
    Allow from env=!HTTPS 
    Require valid-user 
</IfVersion> 
<IfVersion >= 2.4> 
    <If "%{HTTPS} == 'on'"> 
     AuthMerging And 
     Require valid-user 
    </If> 
</IfVersion> 

Requisitos: mod_rewrite, mod_auth, mod_digest, mod_version

+0

Bonito pensamiento, pero falla (error de 500) porque incluso con LWC

+0

@LWC 1.) Los lenguajes de programación son una mala metáfora para su punto. Ejemplo de contador: el código C no válido se puede compilar, si un preprocesador elimina las secciones no válidas. Como usuario, esperaría que IfVersion funcionara de manera similar sin evaluar su contenido. 2.) Tenía esta configuración en uso desde 2014-02 hasta 2014-09 con Apache 2.2.22. Pudo haber sido inválido y podría haber dado lugar a entradas de registro de errores (no lo he comprobado), pero funcionó como se esperaba y no respondió con errores 5xx. (Tal vez solo funcionó debido a la versión de Debian, que a veces se diferencia de la versión original). – Istador

+0

Supongo que no todos, solo muchos de ellos. ¡Gracias por la aclaración! – LWC

7

Muchas gracias, Istador!

Mi Apache es de la versión 2.2 (NAS de Synology DSM 5.1) por lo que estos dos no funcionan en él:

RewriteOptions Inherit 
IfVersion 

Después de tomar ellos (y la sección de la versión> = 2.4) hacia fuera. Todo comenzó a funcionar para mí.

Hay muchas sugerencias para este tema, pasé dos días para probarlas.

Pero solo este funciona para mí.

Aquí es lo que hice:

RewriteEngine on 
RewriteCond %{HTTPS} off 
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] 

AuthType Basic 
AuthName "private area" 
AuthUserFile /path/to/file/.htdigest 

Order Deny,Allow 
Deny from all 
Satisfy Any 
Allow from env=!HTTPS 
Require valid-user 

por lo que es verificado para trabajar en Apache 2.2, Synology DSM 5.1.

+0

Por favor, no agregue "gracias" como respuesta. Una vez que tenga suficiente [reputación] (http://stackoverflow.com/help/whats-reputation), podrá [votar preguntas y respuestas] (http://stackoverflow.com/help/privileges/vote- arriba) que encontraste útil. – Ilya

+0

Eso es extraño. De acuerdo con la documentación de Apache 2.2 para [mod_rewrite] (http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions) (para Apache 1.3 y posterior) y [mod_version] (http: // httpd.apache.org/docs/2.2/mod/mod_version.html) (para Apache 2.0.56 y posterior) ambas directivas deben ser válidas, suponiendo que ambos módulos estén instalados. – Istador

+2

@Ilya. El 'gracias' es útil, ya que la publicación se relaciona con su publicación específica, que es útil para proporcionar contexto para un lector como yo. Sin él, un lector podría suponer que está abordando directamente solo la publicación del OP. ¡Por supuesto, podrían haber hecho un '@Istador' para ser más concisos! – Patanjali

1

Estoy ejecutando Apache 2.2 y ninguna de las soluciones anteriores funcionó para mí. Encontré una solución para mí here. Básicamente, debe establecer SSLRequireSSL y utilizar algún lenguaje de script en ErrorDocument para reenviar a los usuarios a HTTPS. Desafortunadamente, en mi caso, esto solo funciona cuando se accede a archivos particulares en el servidor, NO funciona si solo se proporciona el dominio. Esto es lo que hice:

AuthType Basic 
AuthName "Password Protected Area" 
AuthUserFile /my/path/to/.htpasswd 
#Require valid-user 

<FilesMatch "(^(?!ssl.php).*)"> 
     SSLRequireSSL 
     ErrorDocument 403 /ssl.php 
     Require valid-user 
</FilesMatch> 

la expresión regular en FileMatch dice a Apache que SSLRequireSSL para todos los archivos excepto ssl.php - y hacia adelante al usuario ssl.php si intenta acceder sin SSL.

Mi ssl.php se ve así:

if(!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] == "" || $_SERVER['HTTPS'] == "off") 
{ 
     $redirect = "https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
     header("HTTP/1.1 301 Moved Permanently"); 
     header("Location: $redirect"); 
     exit; 
} 

Lo que ahora sucede:

El último punto es lo que no soy feliz, si alguien tiene una solución para eso, estaría contento de oír hablar de eso. Cosas que me trataron de resolver este problema:

  • cambiado la expresión regular a (^ $) | (^ (ssl.php ?!) *.) Para que coincida también explícitamente cadenas vacías. No funcionó
  • Agregó una regla de reescritura para reescribir una cadena vacía en index.php. Tampoco funciona
3

La solución comprobada https://stackoverflow.com/a/15940387/2311074 funciona en Firefox en Ubuntu 16.04, pero no funciona en Firefox en Windows 7.

Si desea proteger su carpeta https://yourdomain.com/securefolder entonces usted necesita para crear en esa carpeta un .htaccess con el siguiente contenido:

RewriteEngine On 
RewriteCond %{HTTPS} off 
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} 

SSLRequireSSL 
ErrorDocument 403 https://yourdomain.com/securefolder 
AuthType Basic 
AuthName "Admin" 
AuthUserFile /outside/your/www/folder/.htpasswd 
Require user admin Admin 

la forma en que funciona es que cuando se está llamando a la página web a través http:// en lugar de https:// se le redirigirá a la err o página El truco consiste en utilizar el enlace correcto con https:// como página de error predeterminada.

0

Ninguna de las anteriores funcionó para mí, pero esto sí. Mi única preocupación es si hay ciertas condiciones en las que la autenticación no se activa y permite que alguien acceda sin las credenciales. No estoy seguro de que exista, pero tal vez las personas brillantes pueden decir lo contrario.

Este código redirecciona no www a www y http a https, con.htaccess folder auth.

Este es el contenido del archivo .htaccess en el directorio que desea proteger:

RewriteEngine on 
# ensure www. 
RewriteCond %{HTTP_HOST} !^www\. [NC] 
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/foldername/$1 [L,R=301] 
# ensure https 
RewriteCond %{HTTP:X-Forwarded-Proto} !https 
RewriteCond %{HTTPS} !=on [NC] 
RewriteRule ^(.*)$ https://%{HTTP_HOST}/foldername/$1 [L,R=301] 

# Apache 2.4 If 
<If "%{HTTPS} == 'on' && %{HTTP_HOST} =~ /www/"> 
AuthType Basic 
AuthName "Protected folder" 
AuthUserFile "/home/etc/.htpasswds/public_html/foldername/passwd" 
require valid-user 
</If> 
Cuestiones relacionadas