我有一个带有 SSL 证书的 Apache 2.2 服务器托管了几个应该只能使用 SSL 访问的服务。
即:应该允许https://myserver.com/topsecret/而http://myserver.com/topsecret/应该被拒绝,或者,理想情况下,重定向到 https。
http://myserver.com/public不应有此限制,并且应该使用 http 或 https。
允许/拒绝 http 的决定是在顶级目录中做出的,并影响其下的所有内容。
是否可以在 Apache 配置中放置一个指令来限制以这种方式访问?
SSLRequireSSL指令正是您要查找的内容。
如果您不使用虚拟主机,则在您的
<VirtualHost>
, 或顶层:或者在
.htaccess
:在全局配置中,您可以使用:
同样,您可以在安全目录树的第一个目录中使用 .htaccess 文件:
最后一个也可以放在全局或虚拟主机配置中的目录指令中。
有人提到了 SSLRequireSSL,但我认为它本身并不能正常工作,而且我还没有找到一个成功的例子。推荐的方法是https://wiki.apache.org/httpd/RedirectSSL我已经应用了它并且效果很好!
或者,您可以使用服务器端语言为您进行处理,而不是使用 Apache 的配置选项(如果您可能无法访问服务器的配置)。
例如,对于 PHP:
(尽管请注意 - 如果您在 Microsoft IIS 上使用 ISAPI,如果请求未通过 HTTPS 路由,则 $_SERVER['HTTPS'] 变量的值将为“关闭”)
假设您使用的是 VirtualHost 指令,
在拒绝访问的非 ssl 虚拟主机中放置一个目录指令。
然后,在授予访问权限的 ssl 虚拟主机中放置一个目录指令。
我一直在 .htaccess 文件中完成此 mod_rewrite,尽管您也应该能够在主配置文件中完成它。
这是一个指南,其中包含实现此目的的几种方法: Smart HTTP and HTTPS RewriteRule Redirects