【问题标题】:Change all occurrences of "http" to "https" on a wordpress page在 wordpress 页面上将所有出现的“http”更改为“https”
【发布时间】:2011-08-28 13:27:59
【问题描述】:

我正在我的一些由 wordpress 提供支持的网站页面上实施 SSL。 目前,我在受保护的页面上收到混合内容警告 - 我的自定义主题包括所有页面上出现的大量链接和 src 属性。链接出现在页眉、页脚、导航(由 wordpress 功能自动生成)和侧边栏(部分来自插件)中。虽然理论上我可以为安全页面编写自定义页眉和页脚,但在安全页面上使用插件和导航是不可能的。

我一整天都在努力完成的是编写一个 javascript 或 jQuery 函数,将通过 SSL 提供的页面上所有出现的“http”更改为“https”。

这个问题公然向我展示了我编码能力的极限。问题是最终提供的文档包含几个 php 文件,其中一些我几乎无法控制(必须修改插件,这些插件(A)相当复杂,(B)我想在将来更新)。正则表达式对我来说仍然是个谜。

我不知道这是否可能,以及使用 $(document).readywindow.onload 触发更改是否为时已晚无论如何,因为浏览器会更早地发出混合内容警告。

提前致谢,约翰内斯

【问题讨论】:

  • 现在我知道这个问题完全是废话。显然,客户端方法根本没有帮助。我觉得我应该删除这个问题 - 这绝对是 它得到的两个赞成票 - 但我不会搞砸过去并留下我自己愚蠢的残余物。如果有人偶然发现这一点并试图尝试遵循它:不要。公认的答案值得一读,但问题不是。 :)

标签: javascript jquery wordpress ssl


【解决方案1】:

您是否查看过与协议无关的相对 url 前缀?

例如如果您有以下情况

<img src="//myimage.png" />

它将使用页面当前使用的任何协议。 更多信息:http://paulirish.com/2010/the-protocol-relative-url/

【讨论】:

  • 虽然这是一种我不知道的真正有趣的方法,但它只解决了我自己编写的页面中包含的代码的问题。它仍然会涉及更改插件代码和手动生成导航(其内容会定期更改)。不过,感谢您的洞察力 - 我学到了一些新的东西,我相信这些东西将来会很有用!
【解决方案2】:

我同意其他发帖人的观点,他们认为有更好的方法来做你想做的事。话虽如此,听起来你陷入了困境,所以让我来破解它。 (顺便说一句,小费和对协议相对 URL 的 +1 投票;我不知道!)

无论如何,我认为您所追求的是&lt;a&gt; 标签,但应该很容易将其推断给其他人:

if (document.location.protocol === 'https:') {
    $('a').each(function() {
        var href = $(this).attr('href');
        if (href.indexOf('http:') > -1) {
            href = href.replace('http:', 'https:');
            $(this).attr('href', href);
        }
    });
}

有了这些帮助,我鼓励您看看是否有更安全/更实用的方法来做您想做的事情。我还要提到,这种方法可能只适用于链接;在页面加载后修改 CSS 和脚本引用肯定会适得其反,不会得到你想要的结果。

注意“document.location.protocol === 'https:'”中的“:”。

【讨论】:

  • 这非常有用,但你应该在使用 href:if (href != null &amp;&amp; href.indexOf...) 之前做一个空检查,因为锚标签不需要有 href。
【解决方案3】:

如果你只是想确保在发出HTTPS请求时没有混合内容,请尝试在当前主题的“function.php”文件中添加简单的代码sn -p。

function _bd_force_https()
{
    if ( empty( $_SERVER['HTTPS'] ) ) return;
    ob_start();
}
add_action( 'template_redirect', '_bd_force_https', 1 );

function _bd_output_https_page()
{
    if ( empty( $_SERVER['HTTPS'] ) ) return;
    echo str_ireplace( 'http://', 'https://', ob_get_clean() );
}
add_action( 'wp_footer', '_bd_output_https_page', 99 );

优点:

  • 非常精简,添加简单
  • 不使用 javascript/jquery

缺点:

  • 不是插件,所以当主题更改时它会中断
  • 无法拦截来自客户端的 javascripts 发出的 HTTP 请求

【讨论】:

  • +1 尽管这是我的一个古老问题,而且我不喜欢输出缓冲。一定要告诉你这很聪明。
【解决方案4】:

我认为您应该使用plugin like "WordPress HTTPS"。您应该注意太多的边缘情况(例如您无法控制的第三方插件),使用像这样的完善的插件将是一种有趣的方法。

WordPress HTTPS 旨在成为 使用 SSL 的多合一解决方案 WordPress 网站。免费支持 提供!

【讨论】:

  • 我之前是自己提出这个插件的。不幸的是,当我让它重写所有不是 https 服务器的内部和外部链接时,负载突如其来。这似乎是一个完美的解决方案,但使我的服务器无法使用。还是谢谢!
  • 早在当天就发现了这个插件的错误版本。现在像魅力一样工作......
  • 这个插件在我刚试的时候坏了。一旦我保存了设置,它就会在我的浏览器中设置一个垃圾 cookie,导致整个域为我挂起。只是为了那个浏览器,请注意,一旦我清除了 cookie,它就会再次加载,但如果我回到管理区域并再次尝试保存插件的设置,一切都会再次挂起。
  • 说这个插件已经有 2 年历史了,但它仍然可以安全使用吗?
【解决方案5】:

我认为您应该在服务器端执行此操作,方法是设置 cookie 或类似的东西,而不是使用 JavaScript 来处理这种潜在危险的安全漏洞。

【讨论】:

  • 这个,我很震惊 JS 被认为是这个问题的正确答案。
【解决方案6】:

今天遇到了这个确切的问题,wordpress-https 对我根本不起作用,导致我的整个网站在我尝试保存设置后挂在我的浏览器中。我发现了一个简单得多的插件,它可以很好地完成这个技巧:http://wordpress.org/extend/plugins/ssl-insecure-content-fixer/

附带说明,如果您像我一样运行像 nginx 这样的反向代理,您需要遵循此处的建议:http://blog.netflowdevelopments.com/2013/04/10/fixing-this-page-includes-script-from-unauthenticated-sources-problem-with-ssl-wordpress-install-on-apachenginx-server/

基本上是这样的:

if (stripos(get_option('siteurl'), 'https://') === 0) { $_SERVER['HTTPS'] = '开启'; }

在 wp-config.php 文件的末尾

【讨论】:

  • 尝试了 2 个插件和另外一点 config.php 代码,然后这个代码就像一个魅力一样工作!!!
【解决方案7】:

在所有其他迁移步骤之后,如果您仍然获得混合内容:

sudo apt-get install php5-cli
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
pushd /var/www/path/
php /path/to/wp-cli.phar search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run

如果没问题,

php /path/to/wp-cli.phar search-replace 'http://example.com' 'https://example.com' --skip-columns=guid

来自:https://helgeklein.com/blog/2015/01/switching-wordpress-site-http-https/

【讨论】:

    【解决方案8】:

    最好在数据库级别更改旧 URL,恕我直言。要将所有出现的 http:// 替换为与协议无关的 //,请运行以下 SQL:

    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;
    

    更多信息,请查看here

    【讨论】:

      猜你喜欢
      • 2020-11-18
      • 2018-03-08
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2011-02-27
      • 2017-10-15
      • 2016-04-26
      相关资源
      最近更新 更多