web-dev-qa-db-fra.com

Restreindre Apache à n'autoriser l'accès à l'aide de SSL qu'à certains répertoires

J'ai un serveur Apache 2.2 avec un certificat SSL hébergeant plusieurs services qui ne devraient être accessibles qu'en utilisant SSL.

c'est-à-dire: https : //myserver.com/topsecret/ devrait être autorisé tandis que http : //myserver.com/topsecret/ doit être refusé ou, idéalement, redirigé vers https. http://myserver.com/public ne devrait pas avoir cette restriction et devrait fonctionner en utilisant http ou https.
La décision d'autoriser/refuser http est prise dans le répertoire de niveau supérieur et affecte tout le contenu en dessous.

Existe-t-il une directive qui peut être placée dans la configuration Apache pour restreindre l'accès de cette manière?

33
DrStalker

La directive SSLRequireSSL est ce que vous recherchez.

À l'intérieur de votre <VirtualHost>, ou au niveau supérieur si vous n'utilisez pas d'hôtes virtuels:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Ou dans .htaccess:

SSLRequireSSL
38
Thomas

Dans la configuration globale, vous pouvez utiliser:

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

De même, vous pouvez utiliser un fichier .htaccess dans le premier répertoire de l'arborescence de répertoires sécurisés:

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

Cette dernière peut également être placée dans une directive d'annuaire dans la configuration globale ou virtuelle de l'hôte.

8
who

Quelqu'un a mentionné SSLRequireSSL mais je ne pense pas que cela fonctionne par lui-même et je n'ai pas trouvé d'exemple réussi avec lui. La méthode recommandée est https://wiki.Apache.org/httpd/RedirectSSL J'ai appliqué cela et cela fonctionne bien!

1
Robert

Alternativement, vous pouvez utiliser le langage côté serveur pour effectuer le traitement à votre place, plutôt que d'utiliser les options de configuration d'Apache (si, peut-être, vous n'avez pas accès à la configuration du serveur).

Par exemple, avec PHP:

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

(mais sachez que si vous utilisez ISAPI sur Microsoft IIS, si la demande est pas en cours de routage via HTTPS, la valeur de la variable $ _SERVER ['HTTPS'] sera "off" ")

1
Magsol

En supposant que vous utilisez des directives VirtualHost,

Placez une directive d'annuaire dans l'hôte virtuel non SSL refusant l'accès.

Ensuite, placez une directive d'annuaire dans l'hôte virtuel SSL accordant l'accès.

0
Chris

J'ai toujours fait ce mod_rewrite dans un fichier .htaccess, bien que vous devriez également pouvoir le faire dans votre fichier de configuration principal.

Voici un guide avec quelques moyens pour y arriver: redirections Smart HTTP et HTTPS RewriteRule

0
Jason Wadsworth