Javascript 更改所有出现的“事件”;http「;至;https";在wordpress页面上

Javascript 更改所有出现的“事件”;http「;至;https";在wordpress页面上,javascript,jquery,wordpress,ssl,Javascript,Jquery,Wordpress,Ssl,我正在我的wordpress网站的一些页面上实现SSL。 目前,我在受保护的页面上收到混合内容警告-我的自定义主题包括许多链接和出现在所有页面上的src属性。链接出现在页眉、页脚、导航(由wordpress函数自动生成)和侧栏(部分来自插件)中。虽然理论上我可以为安全页面编写自定义页眉和页脚,但在安全页面上使用插件和导航是不可能的 我一整天都在努力完成的是编写一个javascript或jQuery函数,将通过SSL提供服务的页面上出现的所有“http”更改为“https” 这个问题清楚地表明了我

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

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

这个问题清楚地表明了我编码能力的极限。问题在于最终提供的文档由几个php文件组成,其中一些我几乎无法控制(必须修改插件,这些插件(A)相当复杂,(B)我希望将来更新)。正则表达式对我来说仍然是个谜

我不知道这是否可能,也不知道是否用$(document).ready或window.onload触发更改也不会太晚,因为浏览器会在这之前发出混合内容警告


提前感谢Johannes,我认为您应该在服务器端通过设置cookie或类似的东西来实现这一点,而不是使用JavaScript来处理这样一个潜在的危险安全漏洞。

您看过协议无关的相对url前缀了吗

例如,如果您有以下信息:

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

它将使用页面当前所在的任何协议。
更多信息:

我同意其他海报的观点,他们建议有更好的方法来做你想要做的事情。话虽如此,听起来你好像陷入了困境,所以让我来试一下。(顺便说一句,帽子提示和协议相关URL的+1投票;我不知道!)

无论如何,我假设您所追求的是
标记,但这应该很容易推广到其他人:

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和脚本引用肯定会适得其反,不会得到想要的结果

请注意“:”in“document.location.protocol==”https:“

我认为您应该使用一个。有太多的边缘情况,你应该知道(如第三方插件,你没有控制权),并使用一个建立良好的插件,如这一个将是一个有趣的方法

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


今天出现了这个问题,wordpress https对我根本不起作用,导致我的整个网站在我尝试保存设置时挂起在浏览器中。我发现了一个简单得多的插件,它完美地完成了这一任务:

作为补充说明,如果您像我一样运行反向代理,如nginx,则需要遵循以下建议:

基本上说:

if(stripos(get_选项('siteurl'),'https://')==0){ $_服务器['HTTPS']='on'; }


在执行所有其他迁移步骤后的wp-config.php文件结尾处,如果仍然获得混合内容:

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

from:

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

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请求

    • 最好在数据库级别IMHO中更改传统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;
      

      更多信息,请查看

      虽然这是一种我不知道的真正有趣的方法,但它只解决了我自己编写的页面中包含的代码的问题。它仍然需要修改插件代码和手动生成导航(导航的内容会定期更改)。不过,谢谢你的洞察力——我学到了一些新的东西,我相信这些新东西将来会有用的!早些时候,我自己也来过这个插件。不幸的是,当我让它重写所有不是https服务器的内部和外部链接时,负载猛增。这似乎是一个完美的解决方案,但使我的服务器无法使用。无论如何谢谢你!早在那天就发现了这个插件的错误版本。这个插件在我刚尝试的时候就坏了。一旦我保存了设置,它就会在我的浏览器中设置一个垃圾cookie,导致整个域为我挂起。只是为了浏览器提醒你,一旦我清除cookie,它会再次加载,但如果我回到管理区,并试图再次保存插件的设置,一切都会再次挂起。说这个插件已经有2年了,但它仍然可以安全使用吗?现在我知道这个问题是完全错误的。显然,客户端的方法根本没有用。我觉得我应该删除这个问题——这绝对不是它得到的两张赞成票——但我不会把过去搞得一团糟,把我自己愚蠢的残余留在这里。如果有人无意中发现了这一点,并试图遵循它:不要。公认的答案值得一读,但问题不值得一读。:)尝试了2个插件和另一个config.php代码,然后这一个像一个魅力!!!这,我很震惊JS被认为是一个正确的答案