2011-06-23 10 views
7

parece ser el lugar para apache así que aquí va :)Apache 2.2 redirección a continuación, SSL * * hacer de autenticación (con solución <¿pero es basura?)

antiguo problema: ¿cómo así que vuelvo a dirigir HTTP-> HTTPS, entonces y solo si HTTPS, ¿realiza una autenticación?

Oh - y me gustaría que la mayor parte en un único fragmento que puede ser Incluir de opinión en múltiples <directorio> o < ubicación > bloques, por lo que vuelve a escribir en base hay un camino al azar nivel de host virtual ...

Bueno, esto es lo que he que parece funcionar:

En la parte superior de un VirtualHost bloquear

# Set ssl_off environment variable 
RewriteEngine on 
RewriteCond %{HTTPS} =on 
RewriteRule^- [E=ssl] 

En la ubicación o directorio bloque de

RewriteEngine on 
# Case 1 redirect port 80 SSL 
RewriteCond %{HTTPS} !=on 
RewriteCond %{SERVER_PORT} =80 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [R=301] 

AuthType Basic 
AuthBasicProvider external 
AuthExternal auth_pam 
AuthName "My Underpants" 
AuthzUnixgroup on 
Order Deny,Allow 
Deny from all 
Allow from env=!ssl 
Satisfy any 
Require group nice-users 

Ventajas

Todo eso bar del Requerir que se puede abstraer en un archivo de fragmento que debe incluir una línea en cada lugar

Fija forzando SSL y autenticación juntas para cada ubicación, por lo tanto, menos posibilidades de errores

Desventajas

¡Maldita sea, no es muy intuitivo! Podría ser frágil por lo que sé ...

¿Hay una mejor manera (no es que yo haya encontrado ...)?

Comentarios sería muy bienvenido de si eso tiene algún defecto grave :)

Aparte La vida sería mucho más fácil si Apache tenía una sintaxis config sensible con un genérico

< Si la expresión > </Si >

bloque que podría utilizarse en cualquier lugar. Tiene ciertos bloques de casos especiales como IfModule, y luego tiene condiciones especiales de casos como RewriteCond (que es muy difícil de asimilar si no estás acostumbrado).

Saludos,

Tim

+0

¿Quiere decir que usted no desea administrar el VH para SSL y una para no SSL? – regilero

+0

Existen soluciones correctas para este problema si puede pasar a Apache 2.4, consulte ... http://stackoverflow.com/a/26155051/762028 – Molomby

+0

Posible duplicado de [Apache .htaccess redirigir a HTTPS antes de solicitar la autenticación de usuario] (https://stackoverflow.com/questions/10267102/apache-htaccess-redirect-to-https-before-asking-for-user-authentication) – LWC

Respuesta

3

Si tienes intención de forzar el sitio entero a https, puede utilizar los VirtualHost directivas, y entonces es bastante simple:

<VirtualHost *:80> 
    ServerName example.com 

    RedirectMatch (.*) https://example.com$1 

</VirtualHost> 

<VirtualHost *:443> 
    ServerName example.com 

    ... 
    ... 
    ... 
</VirtualHost> 
+0

¡Simple y eficaz! – aland

-1

He probado tu solución y no funcionó ...

Después de un muuuucho tiempo buscando la solución, buscando en Google demasiado y se encuentran siempre las mismas cosas que no funcionaba, finalmente lo hice: yo uso SSLRequireSSL y un ErrorDocument 403 configurado con una página estática que contiene un código JavaScript (gracias a this blog page).

en /etc/apache2/conf.d.opt/redirect_if_not_https.conf:

SSLRequireSSL 
ErrorDocument 403 "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\ 
<html><head>\ 
<title>403 Forbidden</title>\ 
<script language=\"JavaScript\">\ 
window.location='https://'+window.location.hostname+window.location.pathname;\ 
</script>\ 
</head><body>\ 
<h1>Forbidden</h1>\ 
<p>You don't have permission to access that resource using simple HTTP. Please use HTTPS instead.</p>\ 
</body></html>" 

(tenga en cuenta que creé /etc/apache2/conf.d.opt/)

Y en una conf aplicación, incluya ese archivo (por ejemplo, en /etc/apache2/conf.d/trac.conf):

<LocationMatch "/trac"> 
    # All the classical configurations here 
    # ... 

    Include conf.d.opt/redirect_if_not_https.conf 
</LocationMatch> 
+0

Esto no funcionó para mí. Page todavía intenta hacer autenticación básica en http. – sonofagun

+0

Eso funcionó para mí, ¿en qué SO estás tratando de hacer eso? –

+0

Scientific Linux. – sonofagun

2

Tim Watts 'La solución parece funcionar mejor para mí, pero necesitaba un poco de ajuste. Además, mi situación es ligeramente diferente, ya que deseo permitir ciertas direcciones IP sin autenticación HTTP, pero esto solo agrega una línea adicional.

mod_rewrite no heredará la configuración del VirtualHost de forma predeterminada.

Ver: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteoptions

que iba a hacer uso de "RewriteOptions heredan", pero parece que esto se aplica las reglas de los padres después de los niños. En cualquier caso, pensé en una solución diferente.

Dentro de mi SSL <VirtualHost> Tengo la línea:

SetEnvIf Request_URI "/" using_ssl=yes 

Esto establece la variable de entorno using_ssl si la petición URI contiene una barra inclinada Es un poco de truco como yo (es decir, todo el tiempo.) 'd prefieren utilizar el SetEnv incondicional pero al parecer:

las variables de entorno internas establecidas por la presente Directiva se establecen después de directivas de procesamiento de solicitudes más tempranas se ejecutan, tales como control de acceso y mapeo-URI-a nombre de archivo. Si la variable de entorno que está configurando se entiende como entrada en esta fase temprana del proceso, como la directiva RewriteRule, en su lugar debe establecer la variable de entorno con SetEnvIf.

(fuente: http://httpd.apache.org/docs/2.2/mod/mod_env.html#setenv)

Mi config dentro de mi contenedor se ve así:

# Require a basic HTTP auth user 
AuthName "realm-name-goes-here" 
AuthType Basic 
AuthUserFile /var/www/etc/htpasswd 
Require valid-user 

# OR allow from non-SSL (which will be redirected due to mod_rewrite below!) 
Order Allow,Deny 
Allow from env=!using_ssl 

# OR allow from a trusted IP range 
# NB: This allows certain IPs without a username & password 
Allow from 192.168.0.0/16 

Satisfy Any 

# Force a redirect to HTTPS 
RewriteEngine On 
RewriteCond %{HTTPS} !=on 
RewriteRule^https://%{SERVER_NAME}%{REQUEST_URI} [L,R=permanent] 

Es posible que desee probar con sólo 'R' en lugar de 'R = permanente' por primera vez para fines de prueba.

Hope esto es útil para los demás :)

Cuestiones relacionadas