我的网络服务器上安装了一个证书。如果我只想通过 ssl 访问一个页面,我需要在页面上标记什么,或者在其他地方设置另一个设置?
4 回答
这是一个如何在 PHP 中执行此操作的示例
if($_SERVER['SERVER_PORT'] != 443) {
header("Location: https://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
在这里如何在 JavaScript 中做到这一点:
<script type="text/javascript">
if (window.location.protocol != 'https:') {
window.location.href = 'https://' + window.location.host + window.location.pathname;
}
</script>
要仅使用 HTML,您可以执行以下操作:
<meta http-equiv="refresh" content="0;url=https://www.yoursite.com" />
我相信您也可以直接在 Apache 配置中执行此操作。
简而言之,唯一可靠的方法是仅使用https://
URL 链接到它。理想情况下,您应该确保您的用户期望使用 HTTPS,并且他们会检查它是否正确使用(即他们不会忽略浏览器警告)。
在普通 HTTP 请求之后在服务器上强制执行的任何操作都可能容易受到 MITM 攻击。这包括重定向方法mod_rewrite
,PHP 标头(Location
标头),JavaScript(提取window.location
),...,当然还有https://
链接本身的初始传递,如果它是从通过普通 HTTP 提供的页面获得的。即使是由于类似的原因而拒绝访问SSLRequireSSL
也只有在收到纯 HTTP 请求后才有效。
使用这些重定向技术并不是一个坏主意,如果只是为了让您的用户习惯他们使用 HTTPS 的事实(如果在其他情况下他们不是,他们可能会注意到一些奇怪的东西,这可能表明 MITM 攻击),他们至少应该保护他们免受被动窃听攻击。
更一般地说,即使您使用相同的主机名(可能是相同的服务器软件)提供服务http://www.example.com
,https://www.example.com
它们在技术上也是两个不同的主机(例如 Apache Httpd 术语中的虚拟主机),并且托管在一个主机上的资源不需要托管在其他。只需不要在纯 HTTP 主机上通过 HTTPS 提供您只需要的页面。我还建议不要使用重定向(至少在开发阶段),这样当您不使用 HTTPS 链接到这些页面时它会中断:这将有助于检测潜在的混合内容问题。自动重定向主要对直接在浏览器中输入地址的用户有用。
您可以考虑将您的网站放入预加载的HTTP 严格传输安全列表(或至少使用 HSTS,这将使浏览器记住仅在至少工作一次后才使用 HTTPS),但这将适用于整个主机.
您可以在Security.SE和Webmasters.SE上的这些答案中找到更多详细信息。
如果服务器配置正确,您只需使用 https:// 链接到该页面即可。
要检查并确保在没有 https 的情况下无法访问该页面,您可以使用 php 查找当前的确切 URL 并检查其是否为 https,如果不是,则执行简单的重定向到 https://[URL]
如果服务器配置正确,则无需在页面或指向它的链接上放置任何内容。只需在 Apache 配置中使用 SSLRequireSSL 指令为页面定义一个 Location 块。