我正在我的一些wordpress驱动的网站页面上实施SSL。 目前我在安全页面上收到混合内容警告 - 我的自定义主题包括所有页面上出现的大量链接和src属性。链接显示在页眉,页脚,导航(由wordpress功能自动生成)和侧边栏(部分来自插件)中。虽然理论上我可以为安全页面编写自定义页眉和页脚,但是在安全页面上使用插件和导航是不可能的。
我一整天都想完成的是编写一个javascript或jQuery函数,它可以在通过SSL提供的页面上将所有出现的“http”更改为“https”。
这个问题公然向我展示了我编码能力的极限。问题是最终服务的文档包含几个php文件,其中一些我几乎无法控制(必须修改(A)相当复杂的插件和(B)我想在将来更新)。正则表达式对我来说仍然是一个谜。
我不知道这是否可能,以及是否用 $(document).ready 或 window.onload 触发更改都不会太晚无论如何,因为浏览器会在此之前发出混合内容警告。
提前致谢,约翰内斯
答案 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 );
优点:
CONS:
答案 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