Chrome 中的自定义协议处理程序在 SSL 页面上不起作用

Chrome 中的自定义协议处理程序在 SSL 页面上不起作用

我已成功创建并注册了自定义协议处理程序,该处理程序在所有浏览器中均能正常运行。初始警告对话框显示有关启动外部应用程序的信息,这没有问题。

但是,当应用程序部署并且网站在 SSL 下运行时,自定义协议链接在 Chrome 中不再起作用。我看到开发人员工具控制台中出现以下消息:

[已屏蔽] 页面位于https://my.site.com/path/to/page 从 iwd:-action=myaction 运行不安全的内容

相同的链接在 Internet Explorer 和 Firefox 中运行良好。

关于如何实现这一点,您有什么想法吗?顺便说一下,我的外部应用程序是安装在客户端上的控制台应用程序。

编辑:一个额外的重要信息是,该链接指定的目标是同一页面上的隐藏 iframe。

答案1

解决方案是不为 Chrome 用户指定目标框架。看来 Chrome 正在查看从主页传递到嵌入式 iframe 的 URL,并发现嵌入式 iframe URL 不安全,因此拒绝它。

我认为 Chrome 并不总是这样表现,但在 v30+ 中,解决方案似乎是在链接中指定一个空目标。

编辑-扩展解决方案

这是我用来清理链接的目标属性的 JavaScript(仅适用于 Chrome 用户) - 否则,简单的解决方案是首先不在 HTML 中指定目标属性。

// Get a list of all the links with external commands
var commandButtons = $("a[target='my_command']");
updateCommandButtonTargetsForChrome();

// Remove target attribute for Chrome only users
function updateCommandButtonTargetsForChrome() {
    var browserInfo = getBrowserInfo();
    if (browserInfo[0] == "Chrome")
        commandButtons.attr("target", "");
}

function getBrowserInfo() {
    var n = navigator.appName, ua = navigator.userAgent, tem;
    var m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
    if (m && (tem = ua.match(/version\/([\.\d]+)/i)) != null) m[2] = tem[1];
    m = m ? [m[1], m[2]] : [n, navigator.appVersion, '-?'];
    return m;
}

答案2

由于看起来该线程中的所有答案都已在执行特定于 Chrome 的操作,因此有一种更简单的方法可以通过协议处理程序打开仅适用于 Chrome 的应用程序。

只需调用window.location.assign("customprotocol://");。对于用户而言,这将与以前的 IFRAME 方法完全相同。如果用户未安装协议处理程序,则不会发生任何事情。如果安装了协议处理程序,它将打开应用程序。

这只在 Chrome 中有效,因为如果用户的机器上没有安装协议处理程序,Firefox 和 IE 会将用户重定向到“无法加载”页面。

答案3

看起来整个问题都是 URL 的写法问题。

创建不带“//”的 URL:

customproto:xyzabcdef

代替:

customproto://xyzabcdef

答案4

谢谢你找到这个,使用同样的原理,我把它变成了一个动态函数调用,这里是代码:

    <input type='button' value='Test Custom Url' onclick='exec()'>

    <script>
    function submitRequest(buttonId) {
        if (document.getElementById(buttonId) == null || document.getElementById(buttonId) == undefined) return;
        if (document.getElementById(buttonId).dispatchEvent) {
                var e = document.createEvent("MouseEvents");
                e.initEvent("click", true, true);
                document.getElementById(buttonId).dispatchEvent(e);
        } 
        else {
                document.getElementById(buttonId).click();
        }
    }

    function exec(){
        var f = document.getElementById('customUrlLink')
        if (f ) {f.parentNode.removeChild(f);}
        var a = document.createElement('a');
        a.href =  'mycustomproto://arg1';    
        a.innerHTML = "Link"                                    
        a.setAttribute('id',        'customUrlLink');
        a.setAttribute("style", "display:none; "); 
        document.body.appendChild(a); 
        submitRequest("customUrlLink");
    }
    </script>

有一点,此代码不会在 iframe 中运行。因此,iframe 可以在父级中调用此代码,或者可以在父级中创建链接对象。

此外,IE 仅允许使用此方法<1000(我不知道具体数字)个字符。

相关内容