我最近将 CSS-Tricks 迁移到了“全面 HTTPS”。也就是说,此网站上的每个 URL 都强制使用 HTTPS(SSL)协议。不安全的 HTTP 请求将重定向到 HTTPS。以下是一些关于此旅程的笔记。
为什么要这么做?
- 通用安全。当您强制执行 HTTPS 时,您保证了在服务器和客户端之间传递的任何信息都不会被拦截和窃取或以任何方式被篡改。对于像这样的拥有登录系统并在某些地方接受信用卡等的网站来说,这非常棒。
- 按预期显示网站。我听说过一些例子,比如酒店 WiFi 系统甚至 ISP 会干扰 HTTP 流量,并执行诸如插入自己的广告代码等操作。在 HTTPS 上无法做到这一点。
- 搜索引擎优化。谷歌表示您的排名会更高。 马嘴上的话。
- 先决条件。我似乎找不到任何关于此方面的好的链接,但我假设 HTTPS 是 SPDY/HTTP/2 的某些/所有内容所必需的——每个人都认为它很棒并且 超级快。我想确保我已做好准备,以便可以开始推进此项工作。
- 极客信誉。当然。
1. 获取 SSL 证书
不是可选的。这就是它的工作原理。我一生中做过很多次了,而且从来都不太舒服。您只需要仔细遵循说明即可。我过去曾从折扣提供商那里购买过它们,并且实际运行效果很好,但这是一个更手动流程。
CSS-Tricks 很高兴地使用 Media Temple,他们 提供 SSL 作为一项服务,我非常乐意为此付费,以便由专业人员轻松安装。
正确安装 SSL 证书后,您应该能够在HTTP 或HTTPS 上访问您的网站(任何 URL)并使其正常显示。但是,HTTPS 上可能会出现错误,我们将在后面介绍。
2. 从管理区域开始
在 WordPress 世界中,您不妨首先在管理区域启用 HTTPS。它 已设置为处理它,并且可能不会出现任何错误。(我一直说“错误”,我主要指的是“混合内容警告”,我保证我们会讲到。)
要在管理区域强制使用 HTTPS,请将此行添加到 WordPress 安装根目录下的 wp-config.php 文件中
define('FORCE_SSL_ADMIN', true);
请务必先测试 HTTPS 是否正常工作!转到 https://yoursite.com/wp-admin/ 进行检查。否则,您将强制使用无法正常工作的 URL,这很糟糕。如果遇到问题,请立即删除该行。
一切顺利,您将获得安全连接

3. 尝试使前端的一个页面正常工作
下一步是使您的前端使用 HTTPS。立即强制执行所有内容可能会很困难,因此只需从一个目标页面开始。对我来说,它是 The Lodge 的注册页面。该页面可以接受信用卡,因此实际上,它必须是 HTTPS。这是我早期设置此功能的动力。
有一个插件可以帮助您解决此问题:WordPress HTTPS(SSL)。使用此插件,您可以在帖子/页面上获得一个复选框以强制其使用 SSL。

4. 清理混合内容警告
您真正要避免的是

就像:“嘿,尝试使用 HTTPS 很不错,但您还没有完全做到,所以您没有绿色锁!”
如果您打开控制台,您可能会收到类似这样的消息

在这种情况下,是在 CodePen 嵌入中使用了一些带有 HTTP src 的图像。
但它可能是任何东西。HTTP <script>
、HTTP CSS <link>
、HTTP <iframe>
。任何最终发出非 HTTPS 的 HTTP 请求都会触发错误。
您只需要修复它们。全部。
5. 协议相对 URL!(或仅相对 URL)
您知道,那些以 // 开头的 URL,例如
<img src="//example.com/image.jpg" alt="image">
它们是您的朋友。它们将使用当前页面的任何协议加载该资源。并且以相对方式开始的链接将没问题,例如
<img src="/images/image.jpg" alt="image">
我最终在各处都发现了它们。我甚至需要修复自定义字段

6. 更难的问题:旧内容中的图像
此网站上有数千页内容,以及这些页面中的大量图像。就在内容本身中。您正在查看的此页面上就有很多。问题是这些图像在其上具有完全限定的 HTTP 链接。
我不喜欢使用 WordPress 内容上的某些过滤器来对这些 URL 进行某种热交换的想法——我只是想解决这个问题。我聘请了 Jason Witt 来帮助我解决此问题。我们首先做的是在数据库上运行一些 SQL 来修复 URL。本质上是将图像的src
修复为协议相对的。
备份数据库并在本地测试后,这非常有效
UPDATE wp_posts
SET post_content = ( Replace (post_content, 'src="http://', 'src="//') )
WHERE Instr(post_content, 'jpeg') > 0
OR Instr(post_content, 'jpg') > 0
OR Instr(post_content, 'gif') > 0
OR Instr(post_content, 'png') > 0;
以及另一个用于捕获单引号,以防万一
UPDATE wp_posts
SET post_content = ( Replace (post_content, "src='http://", "src='//") )
WHERE Instr(post_content, 'jpeg') > 0
OR Instr(post_content, 'jpg') > 0
OR Instr(post_content, 'gif') > 0
OR Instr(post_content, 'png') > 0;
我们甚至以几乎相同的方式修复了自定义字段
UPDATE wp_postmeta
SET meta_value=(REPLACE (meta_value, 'iframe src="http://','iframe src="//'));
7. 确保新图像为协议相对的
清理旧内容后,我们需要确保新内容保持正常。这意味着修复媒体上传/插入工具,以便它使用协议相对 URL 插入图像。幸运的是,我已经自定义了它以使用<figure>
标签插入,因此这只是一个调整。Jason 最终帮助我将许多自定义 functions.php 代码移到了一个插件中,因此这有点脱离上下文,但我认为您会明白并看到相关的过滤器和内容
class CTF_Insert_Figure {
/**
* Initialize the class
*/
public function __construct() {
add_filter( 'image_send_to_editor', array( $this, 'insert_figure' ), 10, 9 );
}
/**
* Insert the figure tag to attched images in posts
*
* @since 1.0.0
* @access public
* @return string return custom output for inserted images in posts
*/
public function insert_figure($html, $id, $caption, $title, $align, $url) {
// remove protocol
$url = str_replace(array('http://','https://'), '//', $url);
$html5 = "<figure id='post-$id' class='align-$align media-$id'>";
$html5 .= "<img src='$url' alt='$title' />";
if ($caption) {
$html5 .= "<figcaption>$caption</figcaption>";
}
$html5 .= "</figure>";
return $html5;
}
}
8. 您的 CDN 也需要 SSL
如果您设置了 CDN(我通过 W3 Total Cache 使用 MaxCDN),这意味着 CDN 是完全不同的服务器和 URL 以及所有这些,它也需要能够通过 HTTPS 提供服务。幸运的是,MaxCDN 处理它。
9. 开始强制使用 HTTPS
这是我在根目录下的 .htaccess 文件中所做的操作
# Force HTTPS
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
一旦设置完成,就可以关闭插件并从 wp-config.php 文件中删除相关部分,因为现在它们已经冗余了。
您还需要将“常规设置”中的 URL 设置更改为 https:// - 这样 WordPress 中的所有链接都将被正确构建,并且不需要进行重定向。

10. 持续清理
不可避免地,在所有内容都转向 HTTPS 后,您会发现一些页面会出现混合内容警告。您只需要持续调查并修复这些问题。
祝您好运!(如果我弄错了什么,请告诉我)
更新!说到清理……内容安全策略 (CSP) 可能是非常有帮助的技术。它有一个指令,upgrade-insecure-requests,可以强制浏览器对发现的任何 HTTP 资源使用 HTTPS。这有点像一锤定音,但可能非常有用。
如果您现在正在迁移到 HTTPS,并且尽管没有混合内容,但仍然看到灰色/黄色锁,则可能是 SSL 证书存在问题。出于安全原因,现代浏览器目前正在逐步停止支持使用“SHA1”作为散列算法(技术术语)的证书(在未来某个时间点,SHA1 证书将显示红色“不安全”警告),因此您需要与您的 SSL 提供商确认您的新证书(包括整个“证书链”)是否使用 SHA2 或更新版本。
我只是想说出来,因为我之前遇到过这个问题。
这是一个很棒的清单。我也做过很多次了,并且同意您谨慎的措辞(设置起来有点麻烦)。我唯一要评论的是关于 Media Temple 发行的证书。它们不是从您自己的域名发行的,并且会向最终用户发出警告。此警告基本上询问用户是否要信任您的网站。它使您的网站看起来像垃圾邮件。我不得不删除证书,因为这个原因,但尽管与 MT 进行过多次沟通,但几年后,一些网站仍然会收到随机的证书警告 - 对网站流量造成了巨大损害。因此,我唯一不同意的点是使用 Media Temple 提供的证书(我认为它们来自 GoDaddy)。官方地,当事情灾难性地出错时,MT 不提供任何支持,并且控制面板或帐户中心中实际上没有任何内容可以解决它 - 它必须在服务器命令行中完成。
我过去曾使用过此插件来帮助我更新链接
https://wordpress.org/plugins/velvet-blues-update-urls/
插件是一个不错的解决方案,但我建议您像本文中一样手动完成所有操作。或者,您也可以尝试以下选项http://designmodo.com/wordpress-https/。
插件可能会使您的网站加载速度变慢。
您应该与您的主机商讨论他们的 SSL 设置
https://www.ssllabs.com/ssltest/analyze.html?d=css-tricks.com&s=199.83.132.152&hideResults=on
Chris,请参阅https://freakattack.com/以获取有关此问题的更多信息。看起来 Media Temple 对他们自己的https://mediatemple.net使用相同的非安全配置,所以至少他们是一致的。哈哈。
没关系,我错了。FREAK 是 RSA_EXPORT,而 SSL Labs 由于 RC4 而降低了您的分数。不同的弱标准。 :)
有趣的关于手动清理的文章。我最终使用 WP-CLI 对包含我自己的域名的字符串进行了显式搜索和替换。
我建议其他人逐表进行操作,或者至少排除 guid,否则您将重新触发 RSS,如果您安装了任何自动发布脚本,这将是一段糟糕的时光。
我不小心说逐表,但为了澄清,
guid
是wp_posts
中的一列 :)快速说明:SPDY 确实需要 SSL。HTTP2 不需要。但是,某些实现可能需要它。
这篇文章来得太及时了。很快就要将几个 WP 网站迁移到 HTTPS 了。感谢 Chris 的精彩文章!
对于使用 WP-CLI 的用户,您可以使用以下命令将现有博客(数据库)迁移到 HTTPS
wp search-replace ‘http://domain.com’ ‘https://domain.com’
(这是一个好时机,确保代码中没有残留的http://www.domain.com引用,方法是对http://www.domain.com -> https://domain.com运行第二次搜索和替换)
这将使 WordPress 正常运行,但您仍应向服务器配置添加规则以捕获 WordPress 未处理的流量(例如直接访问静态资源)。
使用外部资源的协议相对 URL(例如热链接图像或使用 CDN 作为 javascript/css 库)时要小心,因为如果远程域没有 SSL 证书/不支持 HTTPS,则请求将失败。
这通常对于图像比 CDN 托管的资源更成问题,因为任何值得称道的 CDN 都应该支持 HTTPS。
请记住,Google 已经说过:“我们开始将 HTTPS 作为排名信号。目前,它只是一个非常轻量的信号 - 影响不到全球 1% 的查询。”
也许只有我才会担心
1) 消耗剩余的有限数量的 IP 地址(好吧,我承认 IPv6 将解决此问题)。
2) 通过 HTTPS 为所有网站提供服务将需要 Web 服务器执行更多处理。
3) 网站管理员忘记及时续订 SSL 证书,并由于访客浏览器中的“此网站不安全”警告而导致其流量下降。好吧,这在繁忙的电子商务网站上不应该发生,但我保证它会在某些不需要通过 SSL 提供内容的小型 WordPress 网站上发生。
1) 由于 TLS-SNI,HTTPS 服务器不再需要专用 IP 地址。
2) 由于现代 CPU 中加密算法的硬件实现,这种增加可以忽略不计。
3) 有效点,尽管这不是一个新问题。如果您忘记定期修补服务器,黑客也会使您的网站瘫痪。此外,在任何地方使用加密的主要好处是它会增加“背景噪音”,使加密传输不那么可疑。
1) 大多数现代浏览器现在都支持SNI,因此单独的 IP 地址也不再是必需的。(持怀疑态度的浏览器大多包括旧版 Android、Windows XP 上的 IE 以及 Mac OS X 10.5 上的旧版 Safari)。
2) 根据网站的不同,实际上没有任何额外的开销。
当谷歌说跳的时候,人们就会跳,无论是什么,这总是让我感到惊讶。如果有人在排名方面遇到问题,不要直接转向 https 或最新的谷歌信号 - 首先要开始编写更好的内容并吸引流量。在我看来,除非您经营电子商务网站,否则对于小型博客来说,完全转向 HTTPS 并不值得(至少目前如此),但这篇文章很好地详细介绍了相关步骤。
文章写得很好。我认为应该提到的一件事(归类为 A+)是 HSTS,它基本上可以防止访问者的浏览器在 80 端口上进行超过一次请求。这有点像说“下次你想来这里,直接去 443 端口”。
…这与 HTTP 301 的情况有所不同,但如果说我知道如何处理而不求助于谷歌,那我在撒谎。:-)
正如你提到的,HTTP/2 和 SPDY 使用 TLS。RFC 并没有强制要求使用 TLS,但是很多互联网组件,比如缓存服务器和代理服务器可能无法立即理解 HTTP/2(SPDY 将被弃用)。为了缓解此类问题,通过 TLS 隧道传输请求并立即获得新协议的优势更为简单。
我只是想说这是一篇很棒的文章,非常全面,我一定会将其牢记在心,以备将来迁移到 SSL,我最近一直在做很多,特别是针对 WP。考虑到这一点,我对你的切换感到惊讶。我看到很多网站在谷歌几个月前的公告后进行了切换,现在很多人又切换回来了。这似乎不是一个糟糕的决定,但我认为在这种情况下,优点被夸大了。大多数切换网站的拥有者并没有看到排名的提升,但现在还为时过早,让我们拭目以待。
再次强调,这是一篇非常全面的文章,可能是迄今为止我见过的最好的文章之一。
另外:不要忘记,如果你正在使用 Google 网站管理员工具,你需要进入其中并进行地址更改(或重新添加你的网站),此功能在 WMT 以及 sitemap.xml 等中可能仍然存在问题。
你的 robots.txt 也链接到非 http 版本的 sitemap_index.xml,这可能会导致问题,因为当我尝试在浏览器中加载它时,它显示一片空白。
我同意你的观点。HTTPS 本身是一种 URI 方案,其语法与标准 HTTP 方案相同,除了其方案标记。但是,HTTPS 会向浏览器发出信号,指示其使用 SSL 的额外加密层来保护流量。
简而言之,SSL 是定义如何通过 HTTPS 加密连接的标准。
为什么网站管理员应该使用 HTTPS?因为 HTTPS 在未加密的网络(例如 Wi-Fi)上尤其重要,因为同一本地网络上的任何人都可以“数据包嗅探”并发现敏感信息。
你在开放网络上访问网站时遇到过意外广告吗?
当你通过 HTTPS 安全地提供你的网站内容时,你可以保证没有人会更改用户接收到的内容。如果你认真对待在线业务,你需要 SSL。这是保护用户数据和防止身份盗用的最佳方法。
许多客户会拒绝与没有 SSL 证书的网站进行业务往来。显示你的 SSL 网站安全标志可以告诉客户他们可以放心地购物或使用网站,因为他们知道自己得到了保护。
你可能还需要确保你的会话 Cookie 仅被标记为安全。你可以在你的 php.ini 文件中执行此操作。
session.cookie_secure=1
。有关更多信息,请参见:https://www.simonholywell.com/post/2013/05/improve-php-session-cookie-security.html。感谢分享,这是一篇很棒的文章。我同意你的观点,我宁愿让其他人安装 SSL 证书,因为这是一个痛苦的过程,我讨厌做这件事。
我也对这个想法很感兴趣。有一件事没有提到(而且每次我考虑将所有网站默认设置为 HTTPS 时都会遇到这个问题),那就是是否在你的资产上使用
gzip
。显然,在安全连接上使用压缩可能会让你容易受到 CRIME 漏洞的攻击。这有点糟糕,因为我们都同意压缩是好的。除了它不好的时候,比如当有人可以窃取你的会话 Cookie 时。我刚刚在我的网站Esfera Textual上制作了这个指南。我在一些网页上遇到了问题 4,但通过编辑代码,它完美地解决了。
非常感谢你的这篇文章和这些宝贵的内容。
真的很喜欢这个指南。我刚刚在 Rincón de la Tecnología 上添加了 SSL 加密。现在我将把它添加到 Rincón del Músculo 中。
非常感谢 Chris!!
在我开始说负面的话之前,我确实想感谢 Chris 撰写了一篇经过充分研究的文章。我绝对计划尽快将我自己的个人网站迁移到 HTTPS。
但是……有人考虑过用户体验吗?抱歉没有加入毫无保留的赞美之声,但我怎么能忽视任何点击从协议无关的 href(例如“//www.example.com”)生成的链接的访问者将面临的可怕、令人恐惧的用户体验呢?如果 1)我的网站由 HTTPS 提供服务,而 2)example.com 不是?我的意思是,你们见过那个屏幕吗?它并不令人愉快。它会让访问者对那个其他网站产生最坏的印象,并且由于我的网站将他们发送到那里,因此也会对我的网站产生不好的印象。
哦,我知道你要说什么:放弃所有指向所有不安全网站的链接。好吧,在很多情况下,这在目前还不太实用。毕竟,CSS-Tricks 在大约一个月前还是不安全的。除了每个人同时迁移到 HTTPS 之外,还有其他解决方案吗?
我还没有见过!它在哪些浏览器中发生?我刚刚尝试在 Chrome 中复制该场景,但它似乎没有任何反应。我知道有很多浏览器,我可以进行测试,但我之前从未见过它,所以我认为最好先从你那里获取更多信息。
Chris,你可能需要查看这个插件,它会将任何混合内容记录到仪表板中的一个表格中。
https://wordpress.org/plugins/https-mixed-content-detector/
说实话,我不想当个捣乱的人,我只是认为你应该知道,根据 Irish 先生的说法,协议无关的 URL 现在是一种反模式。
该死的 Siri!!反模式
恐怕我不得不不同意这一点。就在昨天,我的 SSL 内容在这个网站上失败了。我不得不短暂地回到 HTTP,以便网站能够正常工作。如果所有这些文章都包含 HTTPS 链接,那么它们将无法使用,因为它们托管在此处,即 HTTPS 出现故障的同一网站。如果这些图像在其内部硬编码了 HTTPS 图像,那么即使网站处于 HTTP 状态,它们也无法使用。
我知道 Paul 想要表达什么,但我认为这有点复杂。我认为如果你强制使用 HTTPS,协议相对 URL 就没问题。但是,如果你以任何方式提供你的网站,并且非常确信你的 SSL 始终可以 100% 工作(很难保证),那么硬编码 HTTPS 链接可能是明智之举。
我确实注意到你的网站昨天无法正常工作。根据另一条评论,这是“SSL 无处不在”的问题之一——我认为我们可以预期看到更多网站出现更多错误,特别是那些没有及时续订证书的人。
我意识到,如果我们只是因为出现更多问题而放弃某些事情,我们所有人现在仍然会乘坐马车四处旅行。但是对于非电子商务网站和不处理个人信息的网站,我实在看不出有什么好处。
读者 Josiah Altschuler 想指出关于 .htaccess 内容的事情。