处理水景一页网页中 HTTP 与 HTTPS 链接混搭的问题

在刚开始建站的时候并没有考虑使用 SSL 加密连接的问题。现在已经部署了全站 SSL 支持,并打算不久的将来强制全站使用 HTTPS 加密连接。但是可能是因为水景一页网站之前通过非常规的方法切换到了 WordPress 多站点(MultiSite)模式,所以当使用 HTTPS 链接打开网站页面的时候,网页中的一些元素(网址链接、图片和/或文件等)并不一定都是以 HTTPS 链接形式嵌入的。发现这个问题很久了,现在终于忍不住要修理一下了。

这种 HTTP 与 HTTPS 内容混搭的情况还是挺难处理的,因为暂时并不想直接切换到强制全站 HTTPS 的模式,主要是为国内的网络环境考虑(俺的服务器在国外)。页面中有些内容 WordPress 会自动根据用户打开页面时候使用的协议自动选用 HTTP 或 HTTPS 形式,有些却不会自动转换。归一下类的话大致如下,

会自动切换的情况

  1. 文章标题、分类、标签等链接。
  2. 最新文章小工具。

不会自动切换的情况

  1. 自己额外添加的页面元素,如页头、页脚上的链接、文章标题下的作者链接以及文本小工具中的链接。
    • 解决:已经采用去掉 http: 的方式简单处理了,只留个 //cnzhx.net/blog/ 之类的链接地址,前面的协议让浏览器自动补全。
  2. 首页自定义版块中的“更多”链接。
    • 解决:同上。
  3. 首页自定义版块中的“讨论区”文章链接。
    • 解决:因为不能使用没有 http 或 https 开头的省略 RSS 地址链接,所以使用
      $feed =( ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http' ) . '://cnzhx.net/bbs/rss.xml';

      来判断使用 http 还是 https 地址。参考了这里

  4. 最新评论小工具中的作者链接始终为 HTTP 链接;而本站内部的 pingback 文章标题链接却始终为 HTTPS 链接。
    • 解决:因为 recent comments list 小工具是自定义的,采用与下一项目类似的方法处理,直接在生成的 $output 内容里替换。
  5. 文章内容中添加的引用链接。
    • 解决:因为这个问题涉及到所有的子站点,所以通过一个在所有子站点中启用的全局插件来完成。插件代码:
      function cnzhx_ssl_switch($content)
      {
          if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443)
              $content = str_replace('https://cnzhx.net', 'https://cnzhx.net', $content);
          return $content;
      }
      add_filter('the_content','cnzhx_ssl_switch');

      不过这个有个缺陷就是,可能有的时候文章中举例的时候用到了 https://cnzhx.net 这样的字样,也会被替换成 https://cnzhx.net。不过这个影响应该不大,暂时先忽略。实际上因为记不清,又不好搜索,暂时对它也无能为力。如果有朋友遇见这样的问题,还请留言告知。

如果有朋友有好的解决方案,还请留言分享。或者如果发现水景一页网站上有不正常的地方,也请留言提醒一下。©

本文发表于水景一页。永久链接:<https://cnzhx.net/blog/fix-problem-of-mixed-http-and-https-contents/>。转载请保留此信息及相应链接。

14 条关于 “处理水景一页网页中 HTTP 与 HTTPS 链接混搭的问题” 的评论

  1. WordPress官方插件中心一个插件:
    WordPress HTTPS,再加上仪表盘-设置-WordPress地址/站点地址设置为HTTPS,适用于单站点,多站点未测试。

    • 谢谢!
      刚看了看 WordPress HTTPS,对于我的需求来说这个似乎过于强大了。我只是需要 WP 能够根据用户打开页面时使用的协议调整页面中本站链接的头(http 还是 https)。

    • 谢谢建议。不过这个方法是要么 HTTP 要么 HTTPS,不能根据用户使用的连接状态来选择提供 HTTP/HTTPS 链接形式。而且要全文替换的话,使用 MySQL 查询语句针对 post 和 comment 查询替换会更方便。不过我目前还是根据访客的连接来选择性提供不同的链接形式。
      需要调整的也许是应该根据是否是活动的链接(有否 标记)来决定是否替换。

  2. 我刚才升级https后,前端的css和js突然崩掉,连不上,整个主题排版就乱了,但后端是好的。

    • 部分浏览器,如果不是全部的话,会在显示 https 连接打开的页面的时候屏蔽 HTML 源代码中使用了非 https 而是 http 链接提供的资源。你可以从这个方面入手检查一下。

  3. 博主,强制https以后是否可以关闭80端口?

    我用的cloudflare会自动把所有http变成https.

    xiexie

    • 应该还不行吧?一般情况下用户并不会特意去加上 https,都是浏览器或者服务器负责将 http 转成 https 连接。虽然CDN可以帮你转换,可是依赖于CDN来执行这样的转换是不是不太好?这个我不太了解。

      • 再在服务器上301自动转https应该可以吧?

        • 那也要先连到80端口,80端口给出指令让它跳转——除非你主动放弃所有针对80端口的连接尝试。

  4. 这两天SSH和自己搭的梯子一直连不上,今天郁闷之余看到这么个帖子:
    从本月24日开始,中国部分ISP已经实施国外端口白名单政策,国内用户无法访问国外服务器的大部分端口,只能访问指定的几个白名单端口,目前我在深圳用的一个电信网络已经实施,该白名单实施的效果是,用户无法远程SSH管理国外服务器,大部分访问国外的软件和游戏都会异常,如此广泛而无区别的高强度审查,是历史上最严厉的一次,几乎和断网无异。

    • 看到这个传说了。SSH 以前是连接一段时间(我记得大约是 30 分钟,不管是什么端口)之后就会被重置,再多连几次就会被封端口,再然后就可能封 IP。没想到现在这么疯狂了。不知道专门弄个 VPS 用它的 443 端口做代理会怎么样?

      • 我自己以前修改了参数,可以一整天不断开,并且验证了确实有效。19big的时候 每天连上去两三分钟就会断开,之后就要过很长一段时间才能连上。

        但是这几天是根本就连不上啊,一次都连不上啊。今天我试着用21,23端口,都没有成功连上SSH。

        我现在有点担心啊,以后如果端口白名单,再IP黑名单,那可怎么办?

        • 情况是很复杂,我也不知道该怎么办,暂时不在那个环境也没法挨个儿试各种途径。

时间过去太久,评论已关闭。
如果您有话要说,请到讨论区留言并给出此文章链接。
谢谢您的理解 :-)