限制Apache只允许使用SSL访问某些目录

我有一个Apache 2.2服务器与SSL证书承载几个服务,应该只能使用SSL访问。

即: https ://myserver.com/topsecret/应该被允许,而http://myserver.com/topsecret/应该被拒绝,或者理想情况下,被redirect到https。 http://myserver.com/public不应该有这个限制,并应使用http或https工作。
允许/拒绝http的决定是在顶层目录下进行的,影响下面的所有内容。

是否有一个指令可以放在Apache的configuration,以这种方式限制访问?

SSLRequireSSL指令是你正在寻找的。

在你的<VirtualHost>里面,或者在你不使用虚拟主机的情况下,

 <Directory /topsecret> SSLRequireSSL </Directory> 

或在.htaccess

 SSLRequireSSL 

在全局configuration中,您可以使用:

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

同样,您可以在安全目录树的第一个目录中使用.htaccess文件:

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

最后一个也可以放在全局或虚拟主机configuration中的目录指令中。

有人提到SSLRequireSSL,但我不认为它自己的作品,我还没有find一个成功的例子。 推荐的方法是https://wiki.apache.org/httpd/RedirectSSL我已经应用了,它运作良好&#xFF01;

假设你正在使用VirtualHost指令,

在non-ssl虚拟主机中放置一个拒绝访问的目录指令。

然后,在ssl虚拟主机授予访问权限中放置一个Directory指令。

我总是在.htaccess文件中完成这个mod_rewrite,但是你也应该可以在你的主configuration文件中完成。

这里有一个指导,介绍几种方法: 智能HTTP和HTTPS重写规则redirect

或者,您可以使用服务器端语言为您执行处理,而不是使用Apache的configuration选项(如果可能,您没有访问服务器的configuration)。

例如,用PHP:

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

(但是要注意的是,如果您在Microsoft IIS上使用ISAPI,如果请求没有通过HTTPS路由,那么$ _SERVER ['HTTPS']variables的值将被closures)