处理水景一页网页中 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('http://cnzhx.net', 'http://cnzhx.net', $content);
          return $content;
      }
      add_filter('the_content','cnzhx_ssl_switch');

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

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

本文发表于水景一页。永久链接:<http://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来执行这样的转换是不是不太好?这个我不太了解。

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

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

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

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

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

雁过留声,人过留名

您的电子邮箱地址不会被公开。 必填项已用 * 标注

特别提示:与当前文章主题无关的讨论相关但需要较多讨论求助信息请发布到水景一页讨论区的相应版块,谢谢您的理解与合作!请参考本站互助指南
您可以在评论中使用如下的 HTML 标记来辅助表达: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>