2010-12-22 9 views
5

Ich frage mich, was der beste Weg, um HTTPS-Authentifizierung zu erzwingen ist.Wie erzwinge ich HTTPS in einem Verzeichnis UND erzwinge HTTPS-Authentifizierung

Wenn ich dies in meinem .htaccess-Datei:

AuthType Basic 
AuthName "Developer" 
AuthUserFile /usr/local/etc/apache22/passwords/passwords 
Require user david 

Authentifizierung funktioniert, aber es authentifiziert über Port 80, das Passwort im Klartext sendet.

Also dachte ich, ich würde eine Redirect-Regel hinzufügen, alle Nicht-HTTPS-Anfragen auf äquivalente HTTPS-Anfragen zu umleiten:

RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteBase /~david/ 
RewriteRule ^(.*)$ https://myserver.tld/~david/$1 [R,L] 

Dies funktioniert auch, aber es erstes authenicates auf Port 80, dann leitet, dann authenicates wieder an Port 443. Ich möchte mich NICHT an Port 80 authentifizieren, da das Passwort im Klartext gesendet wird. Ich war nicht in der Lage, eine gute Möglichkeit zu finden, sofort zu HTTPS umzuleiten und dann zu authentifizieren.

Der einzige Weg, ich meine, könnte, wie dies zu tun ist, indem Sie diese:

AuthType Basic 
AuthName "Developer" 
AuthUserFile /usr/local/etc/apache22/passwords/passwords 
Require user david 
ErrorDocument 403 /403.php 
SSLRequireSSL 

Und ein 403.php PHP-Skript, auf dem/von meinem Server:

<?php 

header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 

?> 

Dies ist das gewünschte Verhalten. Es erfordert SSL. Wenn Sie also versuchen, auf Port 80 zuzugreifen, wird ein benutzerdefiniertes Fehlerdokument ausgegeben, und dieses Dokument leitet die Seite an HTTPS weiter.

Dies scheint wie ein Klud. Gibt es einen besseren Weg, dies zu erreichen?

+0

Ich denke, du hast es richtig gemacht. Das ist der beste Weg. – bmb

Antwort

13

Das Problem, das Sie haben, ist, dass Ihre oder Block jetzt gilt für den HTTPS und den HTTP-Fall. Du musst das entwirren (naja, eigentlich - du könntest auch 'satisfy any' benutzen - aber das ist in diesem Fall etwas unordentlich).

Ein leicht zu debuggen/verstehen Ansatz ist wie auf eine Struktur gehen:

<VirtualHost *:80> 
    ... 
    RewriteRule ^/foo/bar/?(.*)$ https://myserver.tld/foo/bar/$1 [R,L] 
    # and to guard against typo's... 
    <Directory /foo/bar/> 
     deny from all 
    </Directory> 
</VirtualHost> 


<VirtualHost *:443> 
    ... 
    <Directory /foo/bar/> 
     BasicAuth .. etc. 
     allow from all 
    </Directory> 
</VirtualHost> 

und von dort die Dinge zu nehmen.

Dw.

Verwandte Themen