我的网站有一部分内容使用 SSL,仅供注册用户使用,而其余向公众开放的内容则仅通过 http 提供服务。目前,所有页面(无论是公开页面还是非公开页面)均通过 https 提供服务。此外,公开内容和非公开内容都位于同一个 Web 根目录下。
你们能建议我解决这个问题的方法吗,或者可能是最佳实践指南?谢谢!
编辑
我们使用 LAMP 堆栈。
答案1
这个 Apache 的伪配置将满足您的要求:两个虚拟主机,一个带有 SSL,并从 SSL 所需的路径重定向到站点的 HTTPS 版本。
<VirtualHost *:80>
ServerName www.sample.com
DocumentRoot /var/www/www.sample.com
Redirect permanent /secure https://www.sample.com/secure
Redirect permanent /secure2 https://www.sample.com/secure2
</VirtualHost>
<VirtualHost *:443>
Servername www.sample.com
DocumentRoot /var/www/www.sample.com
SSLEngine On
</VirtualHost>
一旦您为用户提供了与其身份相关的 cookie,最好让他们使用 SSL 版本的网站,这样他们的 cookie 就不会被恶意用户劫持,例如通过未加密的咖啡店无线连接。您有几个选项可以实现这一点。要么使用您的应用程序语言(例如 PHP)检测 cookie,然后重定向到当前页面的 SSL 版本,要么当 cookie 存在时使用 mod_rewrite 强制 SSL。但这是另一个问题...
答案2
首先,请注意,提供混合内容可能会触发浏览器警告,告诉用户他们看到的并非所有内容都是“安全内容”。
其次,除非您遇到性能或延迟问题,否则可能不值得花费精力来区分安全内容和非安全内容。与 10-12 年前相比,SSL 产生的边际服务器负载现在非常小,并且大部分影响是由初始连接协商引起的,无论发生什么,只要您的网站的任何部分需要 SSL,就会发生这种情况。
也就是说,如果您需要提高性能并且可以接受潜在的用户混淆/烦恼,那么我建议设置一个单独命名的主机(例如,如果您的安全网站是www.sample.com,则注册,例如,static.sample.com作为该DNS记录的CNAME /别名(或者如果您觉得奢侈的话,可以作为一个单独的IP)),在Apache中为该名称设置一个新的VirtualHost而不启用SSL,然后使用该位置来存储您的静态内容。
如果您需要逐个目录分离 SSL 和非 SSL 内容,最好的方法是在 Apache 中设置第二个 VirtualHost,监听端口 80 并指向 SSL VirtualHost 指向的同一位置,然后为需要加密的 URI 添加重定向。例如:
<VirtualHost *:80>
ServerName www.sample.com
DocumentRoot /var/www/www.sample.com
Redirect permanent /secure https://www.sample.com/secure
</VirtualHost>
<VirtualHost *:443>
Servername www.sample.com
DocumentRoot /var/www/www.sample.com
SSLEngine On
</VirtualHost>
(我显然省略了很多内容,不要尝试复制和粘贴。)
答案3
最佳做法是不要混合 http 和 https 流量。混合内容可能会造成安全漏洞。攻击者可以调整非 SSL 流量以访问 SSL 部分。
JavaScript 尤其危险。但他们可以更改图像,从而更改页面上显示的说明。过去浏览器中也存在图像和 CSS 漏洞。
另一个讨论是这里。
如果你真的想这样做,那很容易。有两个 apache vhost,一个 SSL,一个不是;但其他都一样。然后在你的 php 代码中,适当地引用你的 URL。
我的许多网站都是这样。例如,网站在您登录之前是非 SSL 的,然后从那以后就完全是 SSL 的了。
答案4
如果混合 https 和 http 内容,客户端会收到错误“未经身份验证的内容警告”。