在wordpress页面上将所有出现的“http”更改为“https”

时间:2011-05-19 04:10:25

标签: javascript jquery wordpress ssl

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

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

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

我不知道这是否可能,以及是否用 $(document).ready window.onload 触发更改都不会太晚无论如何,因为浏览器会在此之前发出混合内容警告。

提前致谢,约翰内斯

8 个答案:

答案 0 :(得分:11)

您是否查看了与协议无关的相对网址前缀?

E.g。如果你有以下

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

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

答案 1 :(得分:6)

我同意其他海报,他们认为有更好的方法来做你想做的事情。话虽如此,这听起来像是你的约束,所以让我提供一个解决方案。 (顺便说一句,帽子提示和协议相对URL的+1票;我不知道那个!)

无论如何,我假设你所拥有的是<a>标签,但应该很容易将其推断给其他人:

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:'”中的“:”。

答案 2 :(得分:5)

我认为你应该使用plugin like "WordPress HTTPS"。你应该注意太多的边缘情况(比如你没有控制权的第三方插件),并使用一个很好的附加组件就像这样,这将是一个有趣的方法。

  

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

答案 3 :(得分:4)

我认为你应该在服务器端这样做,通过设置cookie或类似的东西,而不是使用JavaScript来处理这样一个潜在危险的安全漏洞。

答案 4 :(得分:3)

如果您只想确保在发出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

CONS:

  • 不是插件,所以当主题发生变化时会破坏
  • 无法拦截来自客户端的javascripts发出的HTTP请求

答案 5 :(得分:2)

今天有这个问题,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文件的末尾

答案 6 :(得分:1)

如果您仍然获得混合内容,请执行所有其他迁移步骤:

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/

答案 7 :(得分:0)

最好在数据库级别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;

有关更多信息,请检查here