Beschränken Sie Apache so, dass nur für einige Verzeichnisse der Zugriff über SSL zulässig ist

34

Ich habe einen Apache 2.2-Server mit einem SSL-Zertifikat, der mehrere Dienste hostet, auf die nur mit SSL zugegriffen werden sollte.

Das heißt: https : //myserver.com/topsecret/ sollte zugelassen werden, während http : //myserver.com/topsecret/ entweder abgelehnt oder im Idealfall an https umgeleitet werden sollte. http://myserver.com/public sollte diese Einschränkung nicht haben und entweder mit http oder https funktionieren.
Die Entscheidung, http zuzulassen / abzulehnen, wird im obersten Verzeichnis getroffen und wirkt sich auf den gesamten Inhalt aus, der sich darunter befindet.

Gibt es eine Anweisung, die in die Apache-Konfiguration eingefügt werden kann, um den Zugriff auf diese Weise abzurufen?

DrStalker
quelle

Antworten:

38

Die SSLRequireSSL- Direktive ist genau das, wonach Sie suchen.

In Ihrem <VirtualHost>oder auf der obersten Ebene, wenn Sie keine virtuellen Hosts verwenden:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Oder in .htaccess:

SSLRequireSSL
Thomas
quelle
1
Willkommen bei Server Fault! Wir bevorzugen wirklich, dass Antworten Inhalte haben, keine Verweise auf Inhalte. Dies mag theoretisch die Frage beantworten, es wäre jedoch vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Vielen Dank!
Chris S
8
Ok, ich habe meinen fünf Jahre alten Beitrag mit einem Beispiel aktualisiert :)
Thomas
1
Um fair zu sein, 5 Jahre alt oder nicht, die Begründung lautet, dass der Link, auf den Sie verweisen, möglicherweise verschwindet und Ihre Antwort für jemanden, der später nach Informationen sucht, größtenteils oder gänzlich unbrauchbar wird. Also habe ich Ihren Kommentar wirklich positiv bewertet (ehrlich), aber ich stimme auch voll und ganz zu, dass die Antwort einen gewissen Kontext haben sollte, damit sie nützlich bleibt. Zumal es als die richtige Antwort markiert ist.
Craig
Ich glaube nicht, dass die SO / SF-Community damals so streng in Bezug auf Nur-einen-Link- und "lmgtfy" -Antworten war. Aber ich stimme zu; Eine nachträgliche Bearbeitung ist jederzeit sinnvoll.
Thomas
Zu welcher Konfigurationsdatei würde ich diese Direktiven-Anweisung hinzufügen?
Dan Carter
8

In der globalen Konfiguration können Sie Folgendes verwenden:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Auf ähnliche Weise können Sie eine .htaccess-Datei im ersten Verzeichnis des sicheren Verzeichnisbaums verwenden:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Letzteres kann auch in einer Directory-Direktive in der globalen oder virtuellen Host-Konfiguration platziert werden.

Chris S
quelle
Durch die Umleitung von HTTP zu HTTPS sind Sie bestimmten Arten von MiTM-Angriffen ausgesetzt. Nur zur Vorsicht.
Craig
1

Alternativ können Sie die serverseitige Sprache verwenden, um die Verarbeitung für Sie durchzuführen, anstatt die Konfigurationsoptionen von Apache zu verwenden (wenn Sie möglicherweise keinen Zugriff auf die Serverkonfiguration haben).

Zum Beispiel mit PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

( Beachten Sie jedoch Folgendes: Wenn Sie ISAPI unter Microsoft IIS verwenden und die Anforderung nicht über HTTPS weitergeleitet wird, lautet der Wert der Variablen $ _SERVER ['HTTPS'] "off".)

Magsol
quelle
1

Jemand hat SSLRequireSSL erwähnt, aber ich glaube nicht, dass es von selbst funktioniert, und ich habe kein erfolgreiches Beispiel dafür gefunden. Der empfohlene Weg ist https://wiki.apache.org/httpd/RedirectSSL Ich habe das angewendet und es funktioniert gut!

Robert
quelle
0

Angenommen, Sie verwenden VirtualHost-Direktiven,

Platzieren Sie eine Directory-Direktive in dem Nicht-SSL-VirtualHost, der den Zugriff verweigert.

Fügen Sie dann eine Directory-Direktive in den ssl virtualhost ein, die den Zugriff gewährt.


quelle