WordPress集成Ninja表单提交时出现Mixed Content Exception错误求助
这个问题我之前帮客户排查过好几次,本质就是你的站点已经全站HTTPS了,但Ninja表单还是在调用HTTP的AJAX接口,浏览器出于安全策略直接拦截了请求。下面几个方法按顺序试,基本都能搞定:
检查WordPress核心URL设置
先登录WordPress后台,到「设置→常规」页面,确认「WordPress地址(URL)」和「站点地址(URL)」这两个选项都是以https://开头的,绝对不能是http://。如果之前是HTTP,修改后记得点击保存,然后立刻清除站点缓存。
要是后台修改后还是没生效,直接去数据库的wp_options表(如果你的表前缀不是wp_就对应修改),查siteurl和home这两个字段的值,确保它们也是HTTPS开头的。强制全站HTTPS跳转
给服务器加个强制跳转规则,让所有HTTP请求自动转成HTTPS,从根源上避免混合内容问题:- 如果你用的是Apache服务器,在站点根目录的
.htaccess文件里(放在WordPress默认的Rewrite规则之前)添加这段代码:RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - 要是Nginx服务器,就在站点的server配置块里加:
if ($scheme != "https") { return 301 https://$host$request_uri; }
- 如果你用的是Apache服务器,在站点根目录的
修复Ninja表单的AJAX端点URL
有时候是Ninja表单自身没有正确识别站点的HTTPS状态,导致AJAX URL用了HTTP:- 先把Ninja表单插件更新到最新版本,官方大概率已经修复了这类HTTPS兼容的小问题;
- 如果更新没用,就给主题的
functions.php文件加一段代码,强制把Ninja表单的AJAX URL换成HTTPS:add_filter( 'ninja_forms_ajax_url', 'nf_force_https_ajax_url' ); function nf_force_https_ajax_url( $url ) { return str_replace( 'http://', 'https://', $url ); } - 还可以用数据库替换工具(比如Search Replace DB,注意只在本地或测试环境用,生产环境一定要先备份数据库!),全站搜索
http://my.domain替换成https://my.domain,彻底清理旧的HTTP路径。
清空所有缓存
最后一步很关键:不管是WordPress插件的缓存(比如WP Rocket、W3 Total Cache)、CDN缓存(比如Cloudflare)还是浏览器缓存,全部清一遍。很多时候缓存里还存着旧的HTTP资源路径,导致问题一直卡着。
要是按上面的步骤试完还没解决,就检查下有没有其他插件在修改AJAX URL,或者服务器的SSL配置有没有问题(比如证书是否生效,有没有反向代理导致站点识别成HTTP)。
内容的提问来源于stack exchange,提问作者TheShark

